Pandas如何基于给定非Python字典批量替换数据框列值
分类列批量映射转换实现方案
第一步:将映射表转为Python字典
先把你手里的非字典格式映射表整理为两列结构化数据(如Excel、CSV格式,一列存原文本取值,一列存对应目标数值),再用pandas读取后转成字典:
import pandas as pd # 读取映射表,替换为你自己的文件路径和对应列名 mapping_df = pd.read_excel("映射表文件路径.xlsx") industry_map = dict(zip(mapping_df['原文本列名'], mapping_df['目标数值列名']))
第二步:单列转换实现
用pandas内置的map方法即可完成单列的映射转换,不需要手动写if判断:
# 示例为转换PTOCCUPATIONALINDUSTRY列,新增编码列(也可以直接覆盖原列) df['PTOCCUPATIONALINDUSTRY_编码'] = df['PTOCCUPATIONALINDUSTRY'].map(industry_map)
第三步:30列批量处理方案
提前把所有需要转换的列和对应的映射字典整理为一个总映射字典,遍历即可批量完成转换:
# 总映射字典结构:键为需要转换的列名,值为该列对应的映射字典 column_total_mapping = { "PTOCCUPATIONALINDUSTRY": industry_map, "你要转换的第2个列名": 第2个列对应的映射字典, "你要转换的第3个列名": 第3个列对应的映射字典, # 依次补充剩余27个列的配置即可 } # 批量转换 for col, col_map in column_total_mapping.items(): # 生成新的编码列,要覆盖原列就把f"{col}_编码"改成col df[f"{col}_编码"] = df[col].map(col_map) # 如果需要处理不在映射表中的值,避免生成NaN,可以加fillna,比如: # df[f"{col}_编码"] = df[col].map(col_map).fillna(-1) # -1为自定义的默认值
注意事项
- 如果原列中存在映射表未收录的取值,
map方法会返回NaN,可根据业务需要用fillna设置默认值 - 确保映射表中原文本取值和待转换列的取值完全一致,避免大小写、空格差异导致映射失败
内容的提问来源于stack exchange,提问作者Sean Roudnitsky
相关产品推荐
相关产品推荐

