我有两个数据框,其中一个有
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的每一行,但需要更多时间。我相信有更好的方法。
答案 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==A1
中df
的任何地方都会为其分配数量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']
中减去)