如何在Pandas列中将含字母的编号转换为有序数值并支持回溯
解决方案
要实现固定映射的有序整数编码及反向回溯,用Pandas的factorize()方法最直接——它专门用来把唯一的分类值转成连续整数,而且严格按值的首次出现顺序分配编码,完全符合你的需求。
步骤1:准备数据
先把示例数据加载成DataFrame:
import pandas as pd d = {'id': [156972, 102154, 214717, 84897, 275220, 165759, 42099, 265749, 130474, 15822], 'isbn': ['2842630521', '037570745X','689710879','783547528','786014091','1561581747','553571095','451210220','034540288X','345832710X']} df = pd.DataFrame(data=d)
步骤2:正向编码(转有序整数)
调用factorize()处理目标列,它会返回两个结果:编码后的整数数组,以及所有唯一的原始值数组。
# 处理ISBN列,新增编码列 df['isbn_encoded'], unique_isbns = pd.factorize(df['isbn']) # 如果需要把id列的唯一值也转成连续整数,同样操作 df['id_encoded'], unique_ids = pd.factorize(df['id'])
此时df['isbn_encoded']的结果就是[0,1,2,3,4,5,6,7,8,9],第一个ISBN'2842630521'对应0,第二个'037570745X'对应1,完全符合你的要求。如果有重复值,同一个原始值会被分配相同的编码。
步骤3:反向映射(整数回溯原始值)
利用unique_isbns数组的索引(也就是编码值)和原始值的对应关系,直接构建反向字典:
# ISBN反向映射:编码值 → 原始ISBN字符串 isbn_reverse_map = {code: isbn for code, isbn in enumerate(unique_isbns)} # id反向映射:编码值 → 原始id id_reverse_map = {code: idx for code, idx in enumerate(unique_ids)}
现在就能快速通过编码值找原始值了:
print(isbn_reverse_map[0]) # 输出:'2842630521' print(isbn_reverse_map[1]) # 输出:'037570745X'
为什么用factorize()?
- 映射关系固定:只按首次出现顺序分配编码,不会随机变化,后续重复处理同一数据时结果完全一致。
- 效率高:内部实现优化过,比手动遍历构建映射快得多。
- 同时支持正向编码和反向映射的基础数据,一步到位。
内容的提问来源于stack exchange,提问作者juggernaut mask
相关产品推荐
相关产品推荐

