Pandas高效分组序列ID生成指南

2026年04月24日/ 浏览 11

正文:

在数据分析中,经常需要为分组数据生成序列ID。比如电商订单按用户分组编号,或日志数据按设备ID打标记。传统循环写法效率低下,而Pandas原生方法能轻松实现毫秒级处理。以下是经过实战验证的4种高效方案:

方法1:groupby + cumcount组合

最经典的写法,利用分组后的累计计数生成从0开始的序列:

  
import pandas as pd  
df = pd.DataFrame({'group': ['A', 'A', 'B', 'B', 'B'], 'value': [10, 20, 30, 40, 50]})  
df['seq_id'] = df.groupby('group').cumcount() + 1  # 从1开始编号  

输出效果:
group value seq_id
0 A 10 1
1 A 20 2
2 B 30 1
3 B 40 2
4 B 50 3

方法2:ngroup()全局分组编号

需要获取分组本身的唯一ID时(如SQL中的DENSE_RANK):

  
df['group_id'] = df.groupby('group').ngroup()  

性能优化技巧

当数据量超过100万行时:
1. 优先使用sort=False参数关闭自动排序
2. 对已排序数据添加observed=True提升速度

  
df.groupby('group', sort=False, observed=True).cumcount()  

真实业务案例

某物流系统需要为每个快递网点生成独立运单号,最终采用分组编号+网点前缀的混合方案:

  
df['waybill_no'] = df['branch_code'] + '-' + df.groupby('branch_code').cumcount().astype(str).str.zfill(8)  

生成结果如:”BJ-00000001″、”SH-00000002″等,既保证唯一性又包含业务信息。

通过合理选择分组方法,相比传统Python循环可提升200倍性能。建议在Jupyter中使用%%timeit测试不同数据量下的表现,根据实际场景选择最佳方案。

picture loss