
本文介绍如何使用 `map()` 配合 `combine_first()` 在 pandas 中精准更新县名字段:仅对字典中明确指定的编码进行重命名,其余行自动保留原始县名,避免意外引入 nan。
在处理波兰行政区划数据时,常遇到同名县(如多个“Powiat brzeski”)分布在不同省份的问题。为确保数据唯一性,需将省名后缀追加至县名(如 "Powiat brzeski_Malopolskie"),但直接使用 df['County'] = df['Code'].map(code_to_county) 会导致未匹配编码对应行的 County 值变为 NaN——这是 map() 的默认行为:未命中键返回 NaN。
正确做法是用映射结果“有选择地覆盖”原列,而非完全替换。combine_first() 正是为此设计:它以左侧 Series 为优先,仅在左值为 NaN 时才用右侧对应位置的值填充。
以下是完整、健壮的实现方案:
import pandas as pd
# 原始数据(含未匹配项)
df = pd.DataFrame({
'Code': [1202000, 2402000, 802000, 3017000, 3005000, 9999999],
'County': ['Powiat brzeski', 'Powiat bielski', 'Powiat krośnieński',
'Powiat ostrowski', 'Powiat grodziski', 'Powiat ciechanowski']
})
# 映射字典:仅定义需增强的县(含省名后缀)
code_to_county = {
1202000: "Powiat brzeski_Malopolskie",
2402000: "Powiat bielski_Slaskie",
802000: "Powiat krośnieński_Lubuskie",
3017000: "Powiat ostrowski_Wielkopolskie",
3005000: "Powiat grodziski_Wielkopolskie"
}
# ✅ 安全更新:仅修改匹配项,其余保持原值
df['County'] = df['Code'].map(code_to_county).combine_first(df['County'])
print(df)输出结果:
Code County 0 1202000 Powiat brzeski_Malopolskie 1 2402000 Powiat bielski_Slaskie 2 802000 Powiat krośnieński_Lubuskie 3 3017000 Powiat ostrowski_Wielkopolskie 4 3005000 Powiat grodziski_Wielkopolskie 5 9999999 Powiat ciechanowski
✅ 关键优势:
- 无需预先检查或过滤,逻辑简洁;
- 完全保留原始数据完整性(无信息丢失);
- 可扩展性强——新增映射项只需更新字典,无需改动主逻辑。
⚠️ 注意事项:
- 确保 code_to_county 的键类型与 df['Code'] 列一致(例如均为 int,避免因 str 键导致全部不匹配);
- 若需批量处理多列或复杂逻辑,可封装为函数并加入日志,便于追踪哪些行被实际更新;
- 替代方案(如 fillna() 或 np.where())虽可行,但 combine_first() 语义最清晰、代码最简洁,且天然支持索引对齐,推荐作为首选。
此方法广泛适用于行政区划消歧、产品编码标准化、机构名称规范化等需“条件性增强字段”的典型数据清洗场景。










