
本文介绍两种简洁高效的方法,使用字典对 dataframe 的子集列(而非全部列)进行值映射,避免重复书写列名或链式调用 replace,提升代码可读性与维护性。
在 Pandas 数据处理中,常需将多个列按同一映射规则(如城市缩写标准化)批量替换值。但 DataFrame.replace() 默认作用于全表,若仅需更新部分列(如 col1 和 col2),直接传入 {'col1': name_dict, 'col2': name_dict} 虽可行,却不够灵活;而尝试 df.replace({['col1','col2']: name_dict}) 会因列表不可哈希报错 TypeError: unhashable type: 'list'。
推荐以下两种专业、简洁且可扩展的解决方案:
✅ 方法一:用 dict.fromkeys() 构造列映射字典
利用 Python 内置的 dict.fromkeys(keys, value) 快速生成键值一致的映射字典,一行完成列名到字典的批量绑定:
name_dict = {'PHX': 'PHO', 'BKN': 'NJN'}
cols_to_map = ['col1', 'col2']
df = df.replace(dict.fromkeys(cols_to_map, name_dict))该方法语义清晰:为 cols_to_map 中每个列名分配相同的 name_dict,底层等价于 {'col1': name_dict, 'col2': name_dict},但无需手动重复,尤其适合列数较多时。
✅ 方法二:切片 + 原地替换(推荐用于大表)
先通过列选择器 df[cols] 提取子 DataFrame,再对其调用 replace(),最后赋值回原位置。此方式更直观、内存友好,且支持 inplace=True(但注意:df[cols].replace(..., inplace=True) 不生效,必须显式赋值):
cols_to_map = ['col1', 'col2'] df[cols_to_map] = df[cols_to_map].replace(name_dict)
⚠️ 注意:df[cols].replace(..., inplace=True) 不会修改原 DataFrame 的对应列,这是 Pandas 的常见陷阱。务必采用 df[cols] = ... 赋值模式。
? 验证效果
执行任一方法后,输出符合预期:col1 和 col2 中的 'PHX' → 'PHO'、'BKN' → 'NJN',而 col3 和 'X'(未在字典中)保持不变:
id col1 col2 col3 0 a PHO X PHX 1 b NJN PHO BKN 2 c X NJN PHX 3 d PHO NJN BKN 4 e X X PHX










