You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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,3
  • Conference组生成0,1,2
  • Upcoming Events组生成0,1,2
  • Webinar和Hackathon组各生成0

额外提示

以后遇到分组内计数、排序这类常规需求,优先找Pandas的内置分组方法(比如cumcount()、rank()、cumsum()等),尽量避免用apply——除非你需要处理非常复杂的自定义逻辑,否则apply几乎都是性能瓶颈的来源。

内容的提问来源于stack exchange,提问作者muni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:56:55