如何用列表一次性对 DataFrame 的指定列应用字典映射

8次阅读

如何用列表一次性对 DataFrame 的指定列应用字典映射

本文介绍两种简洁高效的方法,使用列名列表批量对 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()。

text=ZqhQzanResources