Pandas如何基于匹配键用另一DataFrame值更新现有列
实现pandas按关联键更新原有列值
样例数据
持有的两个DataFrame定义如下:
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': [None, None, None, None, None, None, None]})
核心需求为以Merge_Pr列为匹配键,将df1中UniqueName的对应值直接更新到df2已有的Requisition_Number列,不生成冗余新列。
最优实现方法
由于df1中每个Merge_Pr值唯一对应一个UniqueName,直接用map方法做键值映射赋值即可,逻辑简单、运行效率高,不会产生多余列:
- 先将df1转换为匹配键到目标值的映射字典
pr_name_map = df1.set_index('Merge_Pr')['UniqueName'].to_dict() - 直接对df2的目标列赋值完成匹配更新
df2['Requisition_Number'] = df2['Merge_Pr'].map(pr_name_map)
执行完成后df2的输出结果如下,完全符合匹配预期:
| Merge_Pr | Quantity | Requisition_Number |
|---|---|---|
| BKK_AOT | 9240 | PR1 |
| BKK_AOT | 1433 | PR1 |
| BKK_BFS | 56779 | PR2 |
| BKK_TG | 2230 | PR3 |
| BKK_TG | 5560 | PR3 |
| HND_ANA | 1004 | PR18 |
| HND_ANA | 4553 | PR18 |
补充说明
- 如果后续
Requisition_Number列存在部分已填充的非空值,不想被匹配结果覆盖,可以把赋值逻辑替换为如下写法,仅填充空值:df2['Requisition_Number'] = df2['Requisition_Number'].fillna(df2['Merge_Pr'].map(pr_name_map)) - 不推荐用merge实现该需求,merge会生成临时新列,需要额外做列赋值和删列操作,代码冗余度高,仅作参考:
df2 = df2.merge(df1.rename(columns={'UniqueName':'_temp'}), on='Merge_Pr', how='left') df2['Requisition_Number'] = df2['_temp'] df2 = df2.drop(columns='_temp')
内容的提问来源于stack exchange,提问作者toerag
相关产品推荐
相关产品推荐

