在Pandas DataFrame分组级别创建计数器及性能优化
优化分组计数的性能问题
这问题我太熟了!你当前用的apply+reset_index的方法在百万级数据集里确实会跑得特别慢——因为apply本质是在Python层面逐组遍历操作,开销极大,完全没用到Pandas的矢量化优势。咱们换成内置的高效方法就能解决。
最优解决方案:用cumcount()替代apply
Pandas专门提供了cumcount()方法,用于对每组内的行进行从0开始的连续计数,完美匹配你的需求,而且是底层矢量化实现,速度快到飞起。
代码直接替换成下面这行就行:
train['sent_past'] = train.groupby(['user_id', 'communication_type']).cumcount()
为什么这个方法更快?
cumcount()是Pandas的内置分组方法,基于C语言实现,没有Python层面的循环,处理百万行数据基本是秒级完成。- 你的原方法里,
apply(lambda x: x.reset_index())会为每个分组创建新的DataFrame,再提取索引,这中间有大量的内存开销和循环操作,在大数据集下会被放大。
验证结果
用你给出的示例数据集测试,运行上述代码后,得到的sent_past列完全和你期望的输出一致:
Newsletter组生成0,1,2,3Conference组生成0,1,2Upcoming Events组生成0,1,2Webinar和Hackathon组各生成0
额外提示
以后遇到分组内计数、排序这类常规需求,优先找Pandas的内置分组方法(比如cumcount()、rank()、cumsum()等),尽量避免用apply——除非你需要处理非常复杂的自定义逻辑,否则apply几乎都是性能瓶颈的来源。
内容的提问来源于stack exchange,提问作者muni
相关产品推荐
相关产品推荐

