Pandas如何根据关联键用另一DataFrame更新现有列值
Pandas 按匹配键更新指定列实现方案
这个场景是典型的一对一键值匹配填充列场景,不需要用merge做全表关联,直接用映射赋值的方式就能直接写入已有列,不会产生多余字段。
推荐方法:基于映射字典的map赋值
因为df1中每个Merge_Pr对应唯一的UniqueName,先把对应关系转成字典,直接映射赋值给目标列即可:
import pandas as pd # 原始数据定义 df1 = pd.DataFrame({'Merge_Pr': ['BKK_AOT', 'BKK_BFS', 'BKK_TG', 'HND_ANA'], 'UniqueName': ['PR1', 'PR2', 'PR3', 'PR18']}) df2 = pd.DataFrame( {'Merge_Pr': ['BKK_AOT','BKK_AOT','BKK_BFS','BKK_TG','BKK_TG','HND_ANA','HND_ANA'], 'Quantity':[9240, 1433, 56779, 2230, 5560, 1004, 4553], 'Requisition_Number': ['NaN','NaN','NaN','NaN','NaN','NaN','NaN',]}) # 构建匹配键到目标值的映射 pr_map = df1.set_index('Merge_Pr')['UniqueName'].to_dict() # 直接给已有列赋值,无新增列 df2['Requisition_Number'] = df2['Merge_Pr'].map(pr_map)
运行后打印df2,输出完全符合预期:
Merge_Pr Quantity Requisition_Number 0 BKK_AOT 9240 PR1 1 BKK_AOT 1433 PR1 2 BKK_BFS 56779 PR2 3 BKK_TG 2230 PR3 4 BKK_TG 5560 PR3 5 HND_ANA 1004 PR18 6 HND_ANA 4553 PR18
其他可选写法
如果习惯用replace方法,也可以用同样的映射字典实现,效果一致:
df2['Requisition_Number'] = df2['Merge_Pr'].replace(pr_map)
如果一定要用merge实现,需要额外做删列、重命名操作,步骤更繁琐,不推荐:
df2 = df2.merge( df1, on='Merge_Pr', how='left' ).drop(columns=['Requisition_Number']).rename(columns={'UniqueName': 'Requisition_Number'})
注意:如果df1中存在重复的
Merge_Pr值,不要直接用字典映射的方式,需要先对df1做去重处理,保证匹配键唯一再做映射。
内容的提问来源于stack exchange,提问作者toerag
相关产品推荐
相关产品推荐

