如何在pandas DataFrame中插入按分组顺序编号的SEQUENCE子ID列
问题原因
你原有代码无法运行、逻辑不符合预期的原因有两点:
- 多列选择语法错误:pandas 选取多列时必须传入列名列表,
df['ID', 'TYPE']属于非法写法,正确写法为df[['ID', 'TYPE']] - 方法选择错误:
cumsum()用于做累加计算,无法生成组内顺序编号,且没有处理seq前缀的拼接逻辑。
正确实现方案
使用pandas内置的groupby().cumcount()方法即可实现需求,该方法会按行的原始出现顺序,为每个分组内的行生成从0开始的连续整数编号,和你需要的编号规则完全匹配,完整代码如下:
# 生成带seq前缀的顺序子ID列 df['SEQUENCE'] = 'seq' + df.groupby(['ID', 'TYPE']).cumcount().astype(str) # 调整列顺序,和给出的示例列顺序完全对齐 df = df[['ID', 'TYPE', 'SEQUENCE', 'ESC', 'END']]
运行结果
执行代码后得到的DataFrame和预期效果完全一致:
ID TYPE SEQUENCE ESC END 0 TRL EC1 seq0 MISL1123 36 1 TRL EC2 seq1 XISL1124 57 2 LBL EC1 seq0 CARB24 20 3 LBL EC1 seq1 AARB70 96 4 LBL EC2 seq2 MUT23 79
补充说明:
cumcount()默认按行在原表中的先后顺序计数,如果你需要先按某字段排序再生成编号,在分组前先执行df = df.sort_values(by='指定排序字段')即可。
内容的提问来源于stack exchange,提问作者Rob John
相关产品推荐
相关产品推荐

