我有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
,例如,John
是9A
,然后返回其他列,例如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
答案 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