2026年04月24日/ 浏览 11
正文:
在数据分析中,经常需要为分组数据生成序列ID。比如电商订单按用户分组编号,或日志数据按设备ID打标记。传统循环写法效率低下,而Pandas原生方法能轻松实现毫秒级处理。以下是经过实战验证的4种高效方案:
最经典的写法,利用分组后的累计计数生成从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
需要获取分组本身的唯一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测试不同数据量下的表现,根据实际场景选择最佳方案。