
本文介绍两种简洁高效的方法,使用列名列表批量对 pandas dataframe 的子集列(如 col1、col2)应用字典映射,避免重复书写键名或链式调用 replace,兼顾可读性与性能。
在 Pandas 中,当需要仅对部分列(而非整张表)应用字典映射(如将 'PHX' → 'PHO'、'BKN' → 'NJN')时,直接使用 df.replace(name_dict) 会作用于所有列,而显式写出 {'col1': name_dict, 'col2': name_dict} 又显得冗余。幸运的是,有更优雅的解决方案。
✅ 推荐方法一: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))该写法等价于 {'col1': name_dict, 'col2': name_dict},但无需重复输入 name_dict,语义清晰且一行完成。
✅ 推荐方法二:按列切片 + 原地替换(推荐用于大表)
先通过列名列表选取子 DataFrame,再对其整体调用 replace(),并赋值回原位置:
cols_to_map = ['col1', 'col2'] df[cols_to_map] = df[cols_to_map].replace(name_dict)
此方式优势明显:
- 明确作用域:仅影响指定列,逻辑隔离性强;
- 内存友好:对大型 DataFrame 更高效,避免全表扫描;
- 支持链式操作:可无缝嵌入 .assign() 或管道中(如 df.assign(**{c: df[c].map(name_dict).fillna(df[c]) for c in cols_to_map}),但 replace 对未匹配项更鲁棒)。
⚠️ 注意事项:
- replace() 默认保留未匹配的原始值(如 'X' 不变),符合预期;若需强制转换缺失值,可配合 fillna();
- 避免使用 df[col].map(name_dict) 替代 replace() —— map() 会将未匹配项转为 NaN,而 replace() 保持原值,更安全;
- 不要尝试 {['col1','col2']: name_dict},因列表不可哈希,会触发 TypeError。
综上,dict.fromkeys() 适合简洁表达,而列切片赋值更适合生产环境中的可控性和可维护性。两者均显著优于手动重复键名或链式 replace()。










