如何自动将字符串映射为整数?附Pandas数据框示例
类别变量自动化映射方法
问题描述
现有如下示例数据框:
d = {'col': ['ana', 'ben', 'carl', 'dennis', 'earl', ...]} df = pd.DataFrame(data = d)通常当唯一值数量超过5个时,不会使用OHE(独热编码,若有误请指正),而是采用字典映射的方式,示例映射字典如下:
mapping_dict = {'ana': 1, 'ben': 2, 'carl': 3, ...}请问是否有库或方法可实现该映射的自动化(虽手动映射能明确对应关系,但自动化更高效)?
补充说明:使用ascii_lowercase可实现单字母字符串到整数的映射,但如何处理多字符字符串?
解决方案
不用额外找库,Pandas本身就有高效的现成方法,也能自定义规则生成映射,以下是几种常用方式:
1. Pandas factorize() 快速生成映射
这个方法会按值首次出现的顺序给唯一值分配整数,想从1开始的话加个偏移量即可:
# 提取唯一值和对应的初始编码(默认从0开始) mapped_vals, unique_labels = pd.factorize(df['col']) # 生成从1开始的映射字典 mapping_dict = dict(zip(unique_labels, range(1, len(unique_labels)+1))) # 给原数据列做映射转换 df['col_mapped'] = df['col'].map(mapping_dict)
2. 类别类型编码 astype('category').cat.codes
把列转为类别类型后,默认会按字母顺序给唯一值分配编码,同样可以调整起始值:
# 将列转为类别类型 df['col'] = df['col'].astype('category') # 生成映射字典(从1开始) mapping_dict = {label: code+1 for label, code in zip(df['col'].cat.categories, df['col'].cat.codes.unique())} # 直接生成编码列 df['col_mapped'] = df['col'].cat.codes + 1
如果想按值出现的顺序编码,转类别时加ordered=False即可。
3. 自定义规则的映射
如果需要按特定规则(比如字符串长度、自定义排序逻辑)生成映射,用排序+字典推导就能实现:
# 按字符串长度排序唯一值,再生成从1开始的映射 sorted_unique_vals = sorted(df['col'].unique(), key=lambda x: len(x)) mapping_dict = {val: idx+1 for idx, val in enumerate(sorted_unique_vals)} # 应用映射 df['col_mapped'] = df['col'].map(mapping_dict)
关于OHE的补充
你提到的“唯一值超过5个就不用OHE”是合理的——独热编码会生成大量稀疏列,大幅增加数据维度,既占内存又拖慢模型训练,这种情况下用整数映射(标签编码)是更高效的选择。
内容的提问来源于stack exchange,提问作者Wee Liang Kelven Lim
相关产品推荐
相关产品推荐

