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