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

如何自动将字符串映射为整数?附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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:31:02