本文介绍如何利用 pandas 的 `map()` 或 `merge()` 方法,根据另一个 dataframe 中的映射关系(如按 `name` 列),批量更新目标 dataframe 中对应字段(如 `value`)的值,适用于 `name` 在源表中非唯一、但在映射表中唯一的典型场景。
在数据清洗与整合任务中,常需用一个“参考表”(如 df2)中的最新/标准值,去覆盖主表(如 df1)中同名字段的旧值。本例中,df1 的 name 列存在重复(如 emma 出现两次),而 df2 的 name 是唯一键,且仅包含部分映射项(emma→2, mark→3),其余行应保持原值不变——这正适合使用 索引映射(map) 方式,简洁、高效且语义清晰。
推荐首选方法:Series.map()(最直观、性能优)
# 构建示例数据
import pandas as pd
df1 = pd.DataFrame({
'id': [1, 2, 3, 4, 5],
'country': ['romania', 'russia', 'usa', 'china', 'portugal'],
'name': ['john', 'emma', 'mark', 'emma', 'nick'],
'value': [100, 200, 400, 300, 200]
})
df2 = pd.DataFrame({
'id': [1, 2],
'name': ['emma', 'mark'],
'value': [2, 3]
})
# 创建 name → value 的映射字典(自动去重,以 df2 中首次出现为准)
value_map = df2.set_index('name')['value'].to_dict()
# 使用 map 替换 df1 中的 value,未匹配项保留原值(fillna 不必要,map 默认返回 NaN,故用 fillna)
df1['value'] = df1['name'].map(value_map).fillna(df1['value']).astype(df1['value'].dtype)
print(df1)
输出结果完全符合预期:
id country name value 0 1 romania john 100.0 1 2 russia emma 2.0 2 3 usa mark 3.0 3 4 china emma 2.0 4 5 portugal nick 200.0
⚠️ 注意事项: