【问题标题】:pandas: ValueError: Can only compare identically-labeled Series objects熊猫:ValueError:只能比较标签相同的系列对象
【发布时间】:2018-04-08 02:39:36
【问题描述】:

我有 2 个 csv 文件,如下所示,我想在找到它们的值后使用来比较函数来查找个人表现(在 df1 中)是否高于/低于班级平均水平(在 df2 中)。

df1:
 Name    Class    Test1    Test2    Test3
 John       9A       75       83       77
David       9B       65       67       55
Peter       9A       85       90       88
  Tom       9C       74       92       78

df2:
Class    Test1    Test2    Test3
   9A       80       82       84
   9B       84       75       77
   9C       75       78       80

这是我的方法,如果我错了,请随时纠正/指导我。我首先在df1 中找到个人的Class,例如John9A,然后根据9Adf2 中返回Test1Test2 等其他列

target_class = df1.loc[df1['Name'] == 'John', 'Class']
print(target_class)
>>>>9A
Test1_avg = df2.loc[df2['Class'] == target_class, 'Test1']
# ideally it should return 80

我得到了这个ValueError: Can only compare identically-labeled Series objects

或者简单地说,你会如何比较 df1 中 John 的 Test1 和 df2 中 9A 类的 Test1?有没有比我更简单的方法?感谢您的帮助!

更新:然后我将使用这样的比较函数返回一个分数(如果它满足条件)

def comparison(a, b):
    return 2 if a > b else 1 if a == b else -1

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    这是通过pandas.merge 的一种方式。

    # rename df2 columns
    df2 = df2.rename(columns={'Test'+str(x): 'AvgTest'+str(x) for x in range(1, 4)})
    
    # left merge df1 on df2
    res = pd.merge(df1, df2, how='left', on=['Class'])
    
    # calculate comparison results
    comparison = pd.DataFrame(res.loc[:, res.columns.str.startswith('Test')].values  >= \
                              res.loc[:, res.columns.str.startswith('AvgTest')].values,
                              columns=['Comp'+str(x) for x in range(1, 4)])
    
    # join results to dataframe
    res = res.join(comparison)
    
    print(res)
    
    #     Name Class  Test1  Test2  Test3  AvgTest1  AvgTest2  AvgTest3  Comp1  \
    # 0   John    9A     75     83     77        80        82        84  False   
    # 1  David    9B     65     67     55        84        75        77  False   
    # 2  Peter    9A     85     90     88        80        82        84   True   
    # 3    Tom    9C     74     92     78        75        78        80  False   
    
    #    Comp2  Comp3  
    # 0   True  False  
    # 1  False  False  
    # 2   True   True  
    # 3   True  False  
    

    【讨论】:

    • 谢谢!我从没想过将 2 个 dfs 合并为 1 个。只是一个简单的问题,如果我想让比较函数返回一个数字而不是布尔值怎么办,比如 Test1>AvgTest1,然后返回一个像 2 的数字/int,如果 Test1=AvgTest1 ,返回1,如果Test1loc 呢?谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多