如何批量修改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
相关产品推荐
相关产品推荐

