如何将另一个DataFrame中的值添加到与列匹配的行上?

时间:2019-12-16 07:42:32

标签: python pandas numpy dataframe

我有两个DataFrame:

a = pd.DataFrame()
a['id'] = range(0,100)
a['N'] = 100

b = pd.DataFrame()
b['id'] = 3*np.arange(0,100)
b['N'] = 50

我想要做的是针对a中的行,其中'id''id'中一行的b匹配以添加b['N']。由于非常效率低下且for循环的编码不正确,因此类似于:

for idx in a[a.id.isin(b.id)].index:
    a.loc[idx, 'N'] = a.loc[idx, 'N'] + b.loc[b.id == a.loc[idx, 'id'], 'N'].iloc[0]

是否可以通过高效的DataFrame操作来执行上述操作?例如,一种更好的方法可能是只获取ab中具有匹配'id'的行,并通过升序对它们进行排序(以便它们在相同的顺序),然​​后只需添加'N'列即可。这将需要我们选择行,对它们进行排序,添加它们,最后将它们串联回到a中与'id'不匹配的b行中,但效率似乎较低。在pandas / numpy中推荐的方法是什么

2 个答案:

答案 0 :(得分:3)

IIUC,您只需执行merge然后执行sum

a = a.merge(b,on="id",how="left")
a["result"] = a[["N_x","N_y"]].sum(1)

print (a)

    id  N_x   N_y  result
0    0  100  50.0   150.0
1    1  100   NaN   100.0
2    2  100   NaN   100.0
3    3  100  50.0   150.0
4    4  100   NaN   100.0
..  ..  ...   ...     ...
95  95  100   NaN   100.0
96  96  100  50.0   150.0
97  97  100   NaN   100.0
98  98  100   NaN   100.0
99  99  100  50.0   150.0

答案 1 :(得分:3)

假设“ id”是唯一的,则可以使用Series.map并添加映射的值:

a['N'] = a['N'].add(a['id'].map(b.set_index('id')['N']), fill_value=0)

a
    id      N
0    0  150.0
1    1  100.0
2    2  100.0
3    3  150.0
4    4  100.0
..  ..    ...
95  95  100.0
96  96  150.0
97  97  100.0
98  98  100.0
99  99  150.0

[100 rows x 2 columns]