如何为Pandas DataFrame指定列替换为独立/共享的递增唯一字符串?
Pandas DataFrame分组唯一值替换实现方案
核心思路
- 对
itm列单独生成A开头的递增唯一字符串,同一原始值对应固定编码,不同值按规则递增 - 合并
cla1和cla2的所有唯一值,生成X开头的共享递增唯一字符串,通过不同前缀天然避免与itm列编码重复
具体代码实现
假设你的原始DataFrame名为df,直接运行以下代码即可完成替换:
import pandas as pd # ---------------------- 处理itm列 ---------------------- # 提取itm的唯一值,按首次出现顺序生成递增整数编码 itm_unique, itm_codes = pd.factorize(df['itm']) # 动态计算补零位数,保证编码格式统一(比如100个唯一值则补两位零) zero_pad_length = len(str(max(itm_codes))) # 将整数编码映射为A开头的字符串 df['itm'] = [f"A{code:0{zero_pad_length}}" for code in itm_codes] # ---------------------- 处理cla1和cla2列 ---------------------- # 合并两列所有值,获取全局唯一值集合 cla_combined_values = pd.concat([df['cla1'], df['cla2']]).unique() # 生成X开头的共享映射规则 cla_unique, cla_values = pd.factorize(cla_combined_values) cla_zero_pad = len(str(max(cla_unique))) cla_mapping = {val: f"X{code:0{cla_zero_pad}}" for code, val in zip(cla_unique, cla_values)} # 替换cla1和cla2列的原始值 df['cla1'] = df['cla1'].map(cla_mapping) df['cla2'] = df['cla2'].map(cla_mapping)
关键细节说明
- 编码逻辑:
pd.factorize()会给每个唯一值分配从0开始的递增整数,确保同一原始值对应同一编码,完全满足"分组替换为递增唯一字符串"的需求 - 格式统一:通过
zero_pad_length动态计算补零位数,让所有编码长度一致,比如120个唯一值会生成A00到A119的格式 - 避免重复:
itm用A前缀,cla1/cla2用X前缀,两组编码天然不重复,无需额外去重判断 - 可选调整:如果需要按原始值的大小排序生成编码(而非首次出现顺序),可以把
factorize替换为排序后的枚举,比如处理itm的代码改为:
itm_sorted_unique = sorted(df['itm'].unique()) itm_mapping = {val: f"A{i:0{len(str(len(itm_sorted_unique)-1))}}" for i, val in enumerate(itm_sorted_unique)} df['itm'] = df['itm'].map(itm_mapping)
效果验证
运行后你的DataFrame会和示例输出一致:
itm cla1 cla2 num 0 A0 X0 X98 0.7 1 A1 X1 X9 0.9 2 A2 X2 X0 3 3 A3 X3 X2 .11 4 A0 X5 X0 7 ...
内容的提问来源于stack exchange,提问作者Hexadecimalism
相关产品推荐
相关产品推荐

