如何使用Pandas将长行值编码为包含前一列值的短名称
Pandas实现长行值缩短需求的方案如下:
场景假设
假设你的数据集前一列列名为prev_col,待缩短的长值列名为long_col,参考样例如下:
原始数据样例:
prev_col long_col 水果 山东烟台红富士苹果当季现摘脆甜多汁无农药残留 水果 海南三亚金煌芒核薄肉厚香甜无丝 电子产品 2024款14英寸M3芯片8G内存512G固态硬盘笔记本电脑 预期输出效果(短值由前一列值+组内唯一标识组成):
prev_col long_col short_col 水果 ... 水果_1 水果 ... 水果_2 电子产品 ... 电子产品_1
实现方案
方案1:同前一列值分组生成递增序号后缀(最高效,适合海量数据)
用Pandas内置函数实现,无需逐行遍历,千万级数据可秒级运行:
import pandas as pd # 生成短名列,也可以直接赋值给long_col覆盖原长值 df['short_col'] = df.groupby('prev_col').cumcount().add(1).astype(str).radd(df['prev_col'] + '_'
方案2:相同长值对应固定短名(避免重复值对应不同短名)
如果要求同一个长值多次出现时,需要始终对应同一个短名,可先生成映射表再匹配:
# 生成(prev_col, long_col)组合唯一映射 name_map = df.drop_duplicates(['prev_col', 'long_col']\ .assign(short_col = lambda x: x.groupby('prev_col').cumcount().add(1).astype(str).radd(x['prev_col'] + '_')\ .set_index(['prev_col', 'long_col'])['short_col'] # 映射回原数据集 df['short_col'] = df.set_index(['prev_col', 'long_col']).index.map(name_map)
方案3:自定义后缀规则(比如用哈希值做后缀)
如果需要短名和内容关联、不依赖序号顺序,可以自定义生成规则:
import hashlib def gen_short_name(row): # 可根据需求自定义拼接规则 hash_suffix = hashlib.md5(row['long_col'].encode()).hexdigest()[:6] return f"{row['prev_col']}_{hash_suffix}" df['short_col'] = df.apply(gen_short_name, axis=1)
注意事项
- 如果需要直接替换原长值列,把赋值语句左侧的
short_col改为原长值列名即可 - 可根据业务需求调整短名的拼接规则,比如添加固定前缀、调整序号/哈希值长度等
内容的提问来源于stack exchange,提问作者Me0002
相关产品推荐
相关产品推荐

