基于另一个数据框列更新数据框列,不进行for循环



我有两个数据帧df1和df2。

df1:

id val
1  25
2  40
3  78

df2:

id val
2  8
1  5

现在我想用df1['val'] = df1['val']/df2['val']来匹配id。我可以通过迭代所有df2行来做到这一点,因为df2df1的子集,所以它可能缺少一些值,我想保持不变。这是我现在的文件:

for row in df2.iterrows():
df1.loc[df1['id']==row[1]['id'], 'val'] /= row[1]['val']

df1:

id val
1  5
2  5
3  78

如何在不使用for循环来提高速度的情况下实现相同的目标?

使用Series.mapSeries.div:

df1['val'] = df1['val'].div(df1['id'].map(df2.set_index('id')['val']), fill_value=1)
print (df1)
id   val
0   1   5.0
1   2   5.0
2   3  78.0

左连接merge的解:

df1['val'] = df1['val'].div(df1.merge(df2, on='id', how='left')['val_y'], fill_value=1)

print (df1)
id   val
0   1   5.0
1   2   5.0
2   3  78.0

最新更新