You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量修改Pandas DataFrame中多列分类变量的映射取值?

解决方案

你可以通过pandas内置的批量替换能力实现需求,不需要逐列调用方法,两种常用方案如下:


方案1:嵌套字典+replace(推荐,保留未匹配原值)

pandas的replace原生支持传入嵌套字典实现多列不同规则的替换,第一层键为列名,第二层为该列的{原值: 替换值}映射规则,代码示例:

import pandas as pd

# 原始DataFrame
dfa = pd.DataFrame({'s1': ['a', 'b', 'c'], 's2': ['a', 'c', 'd']}, dtype='category')

# 统一维护所有列的映射规则,新增列只需在这里添加对应条目
col_mapper = {
    "s1": {"a": 1, "b": 2, "c": 3},
    "s2": {"a": 10, "b": 40, "c": 50}
}

# 单语句完成所有列的批量替换
dfa = dfa.replace(col_mapper)

该方案的特点:

  • 未出现在映射规则里的取值(如示例中s2列的'd')会保留原值,不会被修改
  • 代码简洁,仅需要维护col_mapper一个映射配置变量,后续新增列不需要修改执行逻辑

方案2:apply+map(适合严格匹配映射的场景)

如果要求不在映射规则里的取值直接置为NaN,可以用本方案:

# 复用上面的col_mapper配置
dfa[col_mapper.keys()] = dfa[col_mapper.keys()].apply(lambda col: col.map(col_mapper[col.name]))

优化拓展

如果需要处理的列有统一命名规则(如s1到s100),可以自动生成列名,不需要手动逐个填写:

# 示例:生成s1到s10的列名列表
target_cols = [f"s{i}" for i in range(1, 11)]

内容的提问来源于stack exchange,提问作者Matheus Barreto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 21:45:01