基于Pandas匹配指定列更新另一DataFrame的VALUE列
Pandas按指定列匹配更新指定列的解决方案
核心思路
仅提取第二个DataFrame中用于匹配的A、B列和待更新的Value列,通过复合键匹配后,只更新第一个DataFrame的VALUE列,不改动其他列。
代码实现
1. 初始化示例数据
import pandas as pd # 需更新的目标DataFrame(df1) df1 = pd.DataFrame({ 'A': [1, 1, 2], 'B': [2, 5, 5], 'C': [3, 3, 3], 'D': [5, 2, 2], 'VALUE': [0, 0, 0] }) # 提供更新值的参考DataFrame(df2) df2 = pd.DataFrame({ 'A': [5, 1], 'B': [3, 5], 'C': [3, 4], 'D': [2, 3], 'Value': [1, 1] })
2. 方法一:映射字典(小数据量友好)
# 构建A+B复合键到Value的映射关系 value_mapping = df2.set_index(['A', 'B'])['Value'] # 仅更新匹配成功的VALUE行,未匹配行保留原值 df1['VALUE'] = df1.apply( lambda row: value_mapping.get((row['A'], row['B']), row['VALUE']), axis=1 )
3. 方法二:merge合并更新(大数据量高效)
# 仅合并需要的字段,避免污染原DataFrame的其他列 temp_merge = df1.merge(df2[['A', 'B', 'Value']], on=['A', 'B'], how='left') # 用匹配到的Value替换原VALUE,未匹配项保留原值 df1['VALUE'] = temp_merge['Value'].fillna(temp_merge['VALUE'])
最终结果
执行后df1将变为:
| A | B | C | D | VALUE |
|---|---|---|---|---|
| 1 | 2 | 3 | 5 | 0 |
| 1 | 5 | 3 | 2 | 1 |
| 2 | 5 | 3 | 2 | 0 |
内容的提问来源于stack exchange,提问作者Thosifer MD
相关产品推荐
相关产品推荐

