如何将DataFrame含重复值的字母数字列映射为整数列并保留映射字典
Pandas 混合类型列转整数编码实现方案
要实现带重复值的字母数字混合列转整数编码、同时留存可复用映射关系的需求,直接用下面的方法即可,编码顺序和值在列中首次出现的顺序一致,完全匹配预期输出效果。
方法1:使用pandas内置factorize(无额外依赖,推荐)
factorize是pandas原生的离散值编码方法,执行效率高,不需要额外安装第三方库:
import pandas as pd # 构造测试用示例数据 df = pd.DataFrame({ 'column': ['a', 'c1', '3vc', 'c1', 'n'] }) # 执行编码:codes为整数编码结果,uniques为按首次出现顺序排列的唯一值列表 codes, uniques = pd.factorize(df['column']) # 编码默认从0开始计数,+1调整为从1开始,匹配输出要求 df['column'] = codes + 1 # 生成可复用映射字典,格式为 {原始字段值: 对应整数} value_map = dict(zip(uniques, range(1, len(uniques)+1)))
后续处理同字段新数据时,直接复用字典即可,不会打乱编码规则:
new_df['column'] = new_df['column'].map(value_map)
方法2:使用sklearn的LabelEncoder
如果日常用sklearn做特征工程流程,也可以用LabelEncoder实现相同效果:
from sklearn.preprocessing import LabelEncoder encoder = LabelEncoder() # 同样+1将编码起始值从0调整为1 df['column'] = encoder.fit_transform(df['column']) + 1 # 生成可复用映射字典 value_map = dict(zip(encoder.classes_, range(1, len(encoder.classes_)+1)))
注意事项
- 两种方法默认的编码顺序完全匹配示例效果:第一个出现的
a对应1,首次出现的c1对应2,首次出现的3vc对应3,重复出现的c1自动匹配2,后续值按首次出现顺序依次顺延编号。 - 映射字典独立存储后,跨批次处理数据、跨脚本复用都不会出现编码不一致的问题。
- 如果需要按值的自然排序(字母、数字排序规则)分配整数,而非按首次出现顺序分配,只需要在生成映射前对唯一值列表做排序处理即可。
处理前注意先过滤列中的空值,避免空值被编码为整数引入异常数据。
内容的提问来源于stack exchange,提问作者Chris_007
相关产品推荐
相关产品推荐

