
本文介绍两种简洁高效的方法,使用字典批量替换 dataframe 中特定列(而非全部列)的值,避免重复书写列名或链式调用 replace,兼顾可读性与性能。
在 Pandas 数据处理中,常需将多个列按同一映射规则(如城市缩写标准化)进行值替换,但又不希望影响其他无关列。例如,给定映射字典 {'PHX': 'PHO', 'BKN': 'NJN'},仅需作用于 col1 和 col2,而保留 col3 原值不变。
直接使用 df.replace(name_dict) 会全局替换所有匹配值,不符合子集操作需求;而显式写出 {'col1': name_dict, 'col2': name_dict} 虽可行,但在列数较多时冗余且易出错。更优雅的解决方案如下:
✅ 方法一:利用 dict.fromkeys() 构造映射字典
该方法生成一个键为指定列名、值均为 name_dict 的字典,供 replace() 直接使用:
name_dict = {'PHX': 'PHO', 'BKN': 'NJN'}
cols_to_map = ['col1', 'col2']
df = df.replace(dict.fromkeys(cols_to_map, name_dict))此写法简洁、函数式风格强,适用于需返回新 DataFrame 的场景(非原地修改)。
✅ 方法二:先切片再替换(推荐用于大型 DataFrame)
通过列索引选取子集后,直接在其上应用 replace(),并赋值回原位置:
cols_to_map = ['col1', 'col2'] df[cols_to_map] = df[cols_to_map].replace(name_dict)
该方式语义清晰、内存友好(避免创建中间全量字典),且天然支持链式操作或后续处理;若需原地修改且不产生副本,这是更高效的选择。
⚠️ 注意事项:
- replace() 默认对字符串、数字等标量值精确匹配,不支持正则或部分匹配(如需模糊替换,请改用 str.replace() 或 applymap);
- 若字典中不存在某列的某个值(如 'X' 未在 name_dict 中定义),该值将保持不变,符合预期;
- 列名列表 cols_to_map 中若包含不存在的列,df[cols_to_map] 会报 KeyError,建议预先校验:assert all(col in df.columns for col in cols_to_map)。
综上,优先推荐方法二(切片 + 替换)——它直观、可控、性能稳健,是生产环境中处理列子集映射的首选实践。










