熊猫:两个数据帧之间的变化

时间:2016-12-02 05:35:18

标签: python pandas difference

我试图找到一种方法来实现以下目标: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看一看!

2 个答案:

答案 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()