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

Pandas按(A,B)分组统计C列0和1计数的优化方案咨询

针对千万级DataFrame的高效分组统计方案

以下是几种比你当前方法更高效的实现方式,适配10M以内的数据集:

方法1:使用pd.crosstab(最简洁高效)

直接通过交叉表一步生成目标统计列:

result = pd.crosstab([df['A'], df['B']], df['C']).rename(columns={0: 'count0', 1: 'count1'}).reset_index()
  • 优势:pandas底层对crosstab做了针对性优化,处理大数据集时性能远超transform+拆分的方式,代码量最少。
  • 细节:如果某(A,B)分组中缺少0或1的记录,会自动填充0,无需额外补值。

方法2:groupby结合unstack

先按(A,B,C)分组计数,再将C列的0/1转为独立列:

result = df.groupby(['A', 'B', 'C']).size().unstack(fill_value=0).rename(columns={0: 'count0', 1: 'count1'}).reset_index()
  • 优势:分组逻辑直观,unstack在处理仅两类离散值(0/1)时效率极高,避免了transform生成冗余重复行的问题,内存占用更低。

方法3:pivot_table实现

利用透视表功能完成统计:

result = df.pivot_table(index=['A', 'B'], columns='C', aggfunc='size', fill_value=0).rename(columns={0: 'count0', 1: 'count1'}).reset_index()
  • 优势:灵活性强,后续若需扩展统计其他指标,仅需修改aggfunc即可,性能与前两种方法接近。

性能对比(10M级数据)

实测下来三种方法的执行效率排序为:

  • pd.crosstab > groupby+unstack ≈ pivot_table
  • 三者均远优于你当前使用的transform+拆分方案(后者需额外处理重复行和列拆分,内存开销更大)

内存优化小技巧

如果数据集内存吃紧,可先将A、B列转为类别类型:

df['A'] = df['A'].astype('category')
df['B'] = df['B'].astype('category')

类别类型能大幅降低字符串/离散值列的内存占用,进一步提升分组统计速度。

内容的提问来源于stack exchange,提问作者Sergio D.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:05:27