根据pandas数据帧中的键列减去列

Ast*_*oAT 12 python dataframe python-3.x pandas

我有两个数据帧看起来像

DF1:

   ID    A   B   C   D 
0 'ID1' 0.5 2.1 3.5 6.6
1 'ID2' 1.2 5.5 4.3 2.2
2 'ID1' 0.7 1.2 5.6 6.0 
3 'ID3' 1.1 7.2 10. 3.2
Run Code Online (Sandbox Code Playgroud)

DF2:

   ID    A   B   C   D 
0 'ID1' 1.0 2.0 3.3 4.4
1 'ID2' 1.5 5.0 4.0 2.2
2 'ID3' 0.6 1.2 5.9 6.2 
3 'ID4' 1.1 7.2 8.5 3.0
Run Code Online (Sandbox Code Playgroud)

df1可以有多个相同的条目,ID而每个条目ID只在df2中出现一次.同样不是IDdf2中的所有都必须存在于df1中.我无法通过使用set_index()df1中的多行来解决这个问题ID,并且IDdf1和df2中没有对齐.

我想创建一个新的数据帧,我根据匹配ID 减去df2[['A','B','C','D']]from中的值df1[['A','B','C','D']].

结果数据框如下所示:

df_new:

   ID     A    B   C   D 
0 'ID1' -0.5  0.1 0.2 2.2
1 'ID2' -0.3  0.5 0.3 0.0
2 'ID1' -0.3 -0.8 2.3 1.6
3 'ID3'  0.5  6.0 1.5 0.2
Run Code Online (Sandbox Code Playgroud)

我知道如何用循环来做这件事,但由于我处理大量数据,这根本不实用.与熊猫接近的最佳方法是什么?

WeN*_*Ben 15

你只需要set_index和subtract

(df1.set_index('ID')-df2.set_index('ID')).dropna(axis=0)
Out[174]: 
         A    B    C    D
ID                       
'ID1' -0.5  0.1  0.2  2.2
'ID1' -0.3 -0.8  2.3  1.6
'ID2' -0.3  0.5  0.3  0.0
'ID3'  0.5  6.0  4.1 -3.0
Run Code Online (Sandbox Code Playgroud)

如果订单是添加reindexdf2的事项

(df1.set_index('ID')-df2.set_index('ID').reindex(df1.ID)).dropna(axis=0).reset_index()
Out[211]: 
      ID    A    B    C    D
0  'ID1' -0.5  0.1  0.2  2.2
1  'ID2' -0.3  0.5  0.3  0.0
2  'ID1' -0.3 -0.8  2.3  1.6
3  'ID3'  0.5  6.0  4.1 -3.0
Run Code Online (Sandbox Code Playgroud)


Ami*_*ory 8

与Wen(谁击败我)建议的类似,您可以使用pd.DataFrame.subtract:

df1.set_index('ID').subtract(df2.set_index('ID')).reset_index()

         A    B    C    D
ID                       
'ID1' -0.5  0.1  0.2  2.2
'ID1' -0.3 -0.8  2.3  1.6
'ID2' -0.3  0.5  0.3  0.0
'ID3'  0.5  6.0  4.1 -3.0
Run Code Online (Sandbox Code Playgroud)