如何快速为百万行Pandas DataFrame添加分组统计列?
优化Pandas分组计数的高效实现方法
针对100万行的DataFrame,你当前的代码可以简化并大幅提速,核心思路是避免创建冗余的dummy列,同时使用Pandas内置的高效聚合方法替代Python层面的lambda函数:
方法一:直接使用groupby.transform('size')(最快最优)
这是最简洁高效的方式,size()直接统计每组的行数,transform会将结果自动广播回原DataFrame的对应行,无需额外列:
# 两种写法效果一致,后者更简洁(size统计组内行数,与具体列无关) df['count'] = df.groupby(['Class_ID', 'Student_ID'])['feature'].transform('size') # 或 df['count'] = df.groupby(['Class_ID', 'Student_ID']).transform('size')
方法二:使用groupby.transform('count')
如果你的feature列没有空值,count()的效果和size完全一致,同样是内置高效方法:
df['count'] = df.groupby(['Class_ID', 'Student_ID'])['feature'].transform('count')
方法三:先统计计数再合并
如果需要更灵活的后续处理,可以先单独生成分组计数表,再通过合并关联回原DataFrame:
counts = df.groupby(['Class_ID', 'Student_ID']).size().reset_index(name='count') df = df.merge(counts, on=['Class_ID', 'Student_ID'], how='left')
提速原因说明
- 去掉了
dummy列的创建,减少了内存占用和数据复制的额外开销 - Pandas内置的
size/count方法基于C语言实现,比Python层面的lambda x: x.sum()执行效率高数倍 - 直接用
transform无需额外的合并操作,逻辑更简洁,减少了中间步骤的耗时
内容的提问来源于stack exchange,提问作者Apook
相关产品推荐
相关产品推荐

