多Series场景下Pandas groupby.size、value_counts与Counter性能对比
多Series组合值计数的性能对比与核心疑问
日常处理数据时,大家聊得比较多的都是单Series里的值计数,但针对两个及以上Series组合值计数的最优实现,相关的深入讨论其实并不多。我最近做了一组基准测试,对比了三种常见的方法,这里跟大家分享下测试结果和几个一直没搞明白的核心疑问:
测试的三种组合值计数方法
- grouper方法:
df.groupby(['A','B'], sort=False).size() - value_counter方法:
pd.Series(list(zip(df.A, df.B))).value_counts(sort=False) - count方法:
Counter(zip(df.A.values, df.B.values))
两个核心疑问
为何grouper比count更高效?
虽然Counter是基于C实现的,但测试发现,哪怕组合的列数从2增加到4,grouper方法依然稳稳保持着性能优势,这背后的底层逻辑是什么?value_counter性能远低于grouper的原因是什么?
是不是因为list(zip(df.A, df.B))构造列表的过程开销太大?还是把列表转成Series时带来了额外的性能损耗?
另外要提一句,这三种方法的输出形式并不相同——比如基于numpy数组的过滤操作会比字典推导更高效,但本文的重点主要放在构建Series格式结果与字典格式结果的性能差异上,其他输出形式的性能暂不展开讨论。
内容的提问来源于stack exchange,提问作者jpp
相关产品推荐
相关产品推荐

