繁体   English   中英

使用公共关键列pandas查找数据框的任何两列之间的差异

[英]find difference between any two columns of dataframes with a common key column pandas

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

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的每一行,但这需要更多时间。 我肯定有更好的方法。

您可以执行索引对齐的减法,大熊猫负责其余的工作。

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

在这种情况下,您可以使用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 因此,在df任何有ID==A1 ,它都被分配了数量11, B2被分配了51,而C1被分配了44。在这里,我仅出于说明目的将其添加为另一列。

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']减去该值)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM