让我们考虑两个数据帧
df1=
A B C D E F G
a1 b1 c1 d1 e1 f1 1
a2 b2 c2 d2 e2 f2 3
a3 b3 c3 d3 e3 f2 5
a4 b4 c4 d4 e4 f4 Nan
df2=
A B C D E F G
a1 b1 c1 d1 e1 f1 1
a2 b2 c2 d2 e2 f2 3
a3 b3 c3 d3 e3 f2 4
a4 b4 c4 d4 e4 f4 Nan
a5 b5 c5 d5 e5 f5 7
我想比较G列上的两个数据帧,但是只有在每个数据帧中的每一行都具有相同值的情况下,我们才应该这样做。因此,从A到F,如果df1和df2中的每一行都相同,则会生成一列称为结果,它显示df1中的G列-df2中的G列,以产生这样的数据帧。
resultdf=
A B C D E F G_DF1 G_DF2 Result
a1 b1 c1 d1 e1 f1 1 1 0
a2 b2 c2 d2 e2 f2 3 3 0
a3 b3 c3 d3 e3 f2 5 4 1
a4 b4 c4 d4 e4 f4 Nan Nan Nan
df2中的行号5应该被丢弃。
我尝试了
result=pd.merge(df1, df2, on=[A,B,C,D,E,F]) but it doesn't seem to work.
答案 0 :(得分:2)
首先,我们以通用的方式获取列名,而无需使用iloc
和tolist
对其进行硬编码。然后,我们在这些列上merge
。最后,我们assign
您的Result
列和drop
G
列:
cols = [col for col in df2.columns if col != 'G']
df2 = df2.merge(df1, on=cols)
df2.assign(Result=df2['G_y'] - df2['G_x']).drop(columns=['G_x', 'G_y'])
输出
A B C D E F Result
0 a1 b1 c1 d1 e1 f1 0.0
1 a2 b2 c2 d2 e2 f2 0.0
2 a3 b3 c3 d3 e3 f2 1.0
3 a4 b4 c4 d4 e4 f4 NaN
或者我们可以使用apply
在一个衬里中执行此操作,但这不是我的首选解决方案:
cols = [col for col in df2.columns if col != 'G']
df2.set_index(cols).merge(df1.set_index(cols),
left_index=True,
right_index=True).apply(lambda x: x['G_x'] - x['G_y'], axis=1)\
.reset_index(name="Result")
答案 1 :(得分:1)
我认为这应该可行:
result = df1.merge(df2, on=['A','B','C','D','E','F'], suffixes=('_DF1','_DF2')).reset_index()
result['Result'] = result['G_DF1'] - result['G_DF2']