找到具有公共键列pandas的任意两列数据帧之间的差异

时间:2018-06-06 02:26:44

标签: python pandas dataframe

我有两个数据框,其中一个有

Title  Name Quantity ID

作为列

,第二个数据框有

ID Quantity

作为行数少于第一个数据帧的列。

我需要根据ID列中的匹配找到两个数据帧的数量之间的差异,并且我希望将这个差异存储在第一个数据帧的单独列中。

  

我试过这个(没用):

DF1[['ID','Quantity']].reset_index(drop=True).apply(lambda id_qty_tup  : DF2[DF2.ID==asin_qty_tup[0]].quantity - id_qty_tup[1] , axis = 1)

另一种方法是应用DF1的ID和数量并迭代DF2的每一行,但需要更多时间。我相信有更好的方法。

2 个答案:

答案 0 :(得分:3)

你可以执行索引对齐的减法,而pandas负责其余的。

df['Diff'] = df.set_index('ID').Quantity.sub(df2.set_index('ID').Quantity).values

<强>演示
这里,changetype是索引,我已经设置了它,所以pd.Series.sub默认情况下会对齐减法。否则,您需要将索引设置为上面。

df1
                      strings      test
changetype                             
0                     a very  -1.250150
1            very boring text -1.376637
2            I cannot read it -1.011108
3                 Hi everyone -0.527900
4             please go home  -1.010845
5               or I will go   0.008159
6                         now -0.470354

df2
                                     strings      test
changetype                                            
0                    a very very boring text  0.625465
1                           I cannot read it -1.487183
2                                Hi everyone  0.292866
3            please go home or I will go now  1.430081

df1.test.sub(df2.test)

changetype
0   -1.875614
1    0.110546
2   -1.303974
3   -1.957981
4         NaN
5         NaN
6         NaN
Name: test, dtype: float64

答案 1 :(得分:1)

在这种情况下,您可以使用map

df['diff'] = df['ID'].map(df2.set_index('ID').Quantity) - df.Quantity

一些数据

import pandas as pd
df = pd.DataFrame({'Title': ['A', 'B', 'C', 'D', 'E'],
                   'Name': ['AA', 'BB', 'CC', 'DD', 'EE'],
                   'Quantity': [1, 21, 14, 15, 611],
                   'ID': ['A1', 'A1', 'B2', 'B2', 'C1']})

df2 = pd.DataFrame({'Quantity': [11, 51, 44],
                    'ID': ['A1', 'B2', 'C1']})

我们将使用df2创建一个字典,可用于将ID映射到Quantity。因此,ID==A1df的任何地方都会为其分配数量11,B2会被分配51而C1会被分配44。这里&#39;我将其添加为另一列仅用于说明目的。

df['Quantity2'] = df['ID'].map(df2.set_index('ID').Quantity)
print(df)

   ID Name  Quantity Title  Quantity2
0  A1   AA         1     A         11
1  A1   BB        21     B         11
2  B2   CC        14     C         51
3  B2   DD        15     D         51
4  C1   EE       611     E         44
Name: ID, dtype: int64

然后你可以减去df['Quantity']和我们刚刚创建的列以获得差异。 (如果你想要另一个区别,可以从df['Quantity']中减去)