2016-12-02 44 views
0

我正在试图找到一种方法来实现以下目标: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,并且它提到的计算器链接,但我需要改变,只仅适用于特定列,并用新密钥(我的示例中为Col1)添加新行gether

感谢vm看看!

+0

那么,你需要的结果输出:块? –

+0

确实..这是我创建的一个例子,我认为我的问题的所有方面 – spiff

回答

2

按我的理解,你是在做col3的DF2,DF1,你可以尝试

df2.set_index(['Col1', 'Col2', 'Col4', 'Col5']).sub(df1.set_index(['Col1', 'Col2', 'Col4', 'Col5']), fill_value=0).reset_index() 
+0

欢呼声!是如此简单,需要了解set_index()更好..谢谢 – spiff

+0

很高兴它帮助.. –

2

如果标识符是列C1,C2,C4和C5,你可以将它们设置为索引,并使用.sub

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 

您可以在结束通话reset_index,太:

df2.set_index(idx).sub(df1.set_index(idx), fill_value=0).reset_index() 
Out[17]: 
    Col1 Col2 Col4  Col5 Col3 
0  1 ABC xxx  apple -23.0 
1  1 DEF xxx  apple -24.0 
2  2 ABC yyy  banana -40.0 
3  2 PQR yyy  banana 65.0 
4  3 ABC zzz  pear 12.0 
5  3 DEF zzz  pear 10.0 
6  4 PQR mmm pineapple 26.0 
+0

谢谢vm ..想@aakash_makwana在一行中做同样的事情?因此已经接受 – spiff

+0

当然,一条线也是可能的。我认为这更具可读性。不用谢。 :) – ayhan

+0

你确实是对的,这个更具可读性 – spiff