我试图找到一种方法来实现以下目标:df1和df2是两个示例数据帧,我需要在这些数据帧之间找到差异。它们具有相同的列,但行数据可以根据添加的新名称,旧删除或现有集合的数据更改而更改。
DF1:
Col1 Col2 Col3 Col4 Col5
0 1 ABC 94 xxx apple
1 1 DEF 24 xxx apple
2 2 ABC 40 yyy banana
3 3 ABC 74 zzz pear
4 3 DEF 43 zzz pear
DF2:
Col1 Col2 Col3 Col4 Col5
0 1 ABC 71 xxx apple
1 2 PQR 65 yyy banana
2 3 ABC 86 zzz pear
3 3 DEF 53 zzz pear
4 4 PQR 26 mmm pineapple
输出:
Col1 Col2 Col3 Col4 Col5
0 1 ABC -23 xxx apple
1 1 DEF -24 xxx apple
2 2 ABC -40 yyy banana
3 2 PQR 65 yyy banana
4 3 ABC 12 zzz pear
5 3 DEF 10 zzz pear
6 4 PQR 26 mmm pineapple
我已经尝试了this和它提到的stackoverflow链接,但我需要将更改仅适用于特定列,并使用新密钥(在我的示例中为Col1)附加新行
感谢vm看一看!
答案 0 :(得分:2)
如果标识符是列C1,C2,C4和C5,您可以将它们设置为索引并使用permission granted
:
.sub
你也可以在最后调用reset_index:
idx = ['Col1', 'Col2', 'Col4', 'Col5']
df2.set_index(idx).sub(df1.set_index(idx), fill_value=0)
Out[16]:
Col3
Col1 Col2 Col4 Col5
1 ABC xxx apple -23.0
DEF xxx apple -24.0
2 ABC yyy banana -40.0
PQR yyy banana 65.0
3 ABC zzz pear 12.0
DEF zzz pear 10.0
4 PQR mmm pineapple 26.0
答案 1 :(得分:2)
根据我的理解,你在Col3上做df2-df1,你可以尝试
df2.set_index(['Col1', 'Col2', 'Col4', 'Col5']).sub(df1.set_index(['Col1', 'Col2', 'Col4', 'Col5']), fill_value=0).reset_index()