我有两个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'的行,对它们进行升序排序(以使它们是相同的完全相同的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]

关于python - 如何将另一个DataFrame中的值添加到与列匹配的行中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59352343/

10-12 21:46
查看更多