我有两个数据框:
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' ,按升序对它们进行排序(以便它们是相同顺序的完全相同的 ID),然后只需添加 'N'柱子。这将需要我们选择行,对它们进行排序,添加它们,最后连接回 a 的行。没有匹配 'id'在b ,但也显得效率低下。在 pandas/numpy 中推荐的做法是什么
请您参考如下方法:
假设“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]
