![](/img/trans.png)
[英]python / pandas - Find common columns between two dataframes, and create another one with same columns showing their difference
[英]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.