pandas:ValueError:只能比较带有相同标签的Series对象

时间:2018-04-08 02:39:36

标签: python pandas dataframe

我有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

这是我的方法,如果我错了,请随时纠正/指导我。我首先在Class中找到个人的df1,例如,John9A,然后返回其他列,例如Test1或{{1} } Test2基于df2

9A

我得到了这个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

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

更新:我会使用这样的比较功能,如果符合条件,则返回分数

ValueError: Can only compare identically-labeled Series objects

1 个答案:

答案 0 :(得分: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