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.
相关产品推荐
相关产品推荐

