如何在Pandas分组聚合时仅计算一次组均值以优化性能?
解决方案
核心思路
先一次性计算每组的均值并映射到原数据的每一行,再基于该均值列完成统计,彻底避免重复计算组均值。
代码实现
首先定义原始DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({'a':[1,2,np.nan,3,4,5,3], 'b':[11,22,22,11,22,22,22]})
步骤1:计算每组均值并广播到每一行
使用groupby.transform方法,每组均值仅计算一次,结果会自动匹配原DataFrame的行索引,对应到组内每一行:
df['group_mean'] = df.groupby('b')['a'].transform('mean')
步骤2:统计符合条件的元素数量
过滤掉a列的空值后,通过布尔索引筛选出a < 组均值的行,再按b分组统计数量:
# 简洁版:布尔索引 + groupby.size() result = df[df['a'].notna() & (df['a'] < df['group_mean'])].groupby('b').size() # 可读性版:过滤后用apply统计 result = df[df['a'].notna()].groupby('b').apply(lambda x: (x['a'] < x['group_mean']).sum())
输出结果
执行后result的输出为:
b 11 1 22 2 dtype: int64
效率优势
相比直接在agg中重复计算组均值的方案,transform确保每组均值只计算一次,后续的比较和统计都基于预计算好的均值列,避免了组内每行重复计算均值的冗余操作,数据量越大,性能提升越明显。
内容的提问来源于stack exchange,提问作者hildes11946
相关产品推荐
相关产品推荐

