如何在pandas中实现类似Excel AVERAGEIF的条件均值计算功能
问题原因
你原来的代码出错的核心是布尔索引的维度和筛选逻辑不匹配:你生成的df[['Rank A', 'Rank B', 'Rank C']] > 50是一个3列的布尔矩阵,直接用来索引整个DataFrame时,会把所有不满足Rank>50的位置全部置为NaN,最终取XS列计算时全为NaN值,求均值自然返回nan。
正确实现方案(向量化,高性能适配大数据量)
假设你的表结构是Rank A对应XS A、Rank B对应XS B、Rank C对应XS C的配对关系,有两种常用实现方式,完全匹配Excel AVERAGEIF的计算逻辑:
方式1:逐列配对计算(逻辑清晰,适合列数可控的场景)
# 定义配对的列名 rank_cols = ['Rank A', 'Rank B', 'Rank C'] xs_cols = ['XS A', 'XS B', 'XS C'] result = {} for r_col, x_col in zip(rank_cols, xs_cols): # 仅对对应Rank列>50的行计算XS列均值,全程为底层向量化操作,无额外开销 result[x_col] = df.loc[df[r_col] > 50, x_col].mean() # 按需转换为Series或DataFrame使用 result_series = pd.Series(result)
方式2:掩码矩阵批量计算(性能更高,适合列数极多的场景)
如果你的列规模很大,可以直接用掩码矩阵批量处理,进一步减少Python层的循环开销:
# 生成Rank列的条件掩码 rank_mask = df[['Rank A', 'Rank B', 'Rank C']] > 50 # 掩码对齐到XS列,不满足条件的位置置为NaN后直接求列均值 xs_mean = df[['XS A', 'XS B', 'XS C']].where(rank_mask).mean()
这种方式全程为C层面的向量化运算,30万行×110列的规模可以毫秒级完成计算,完全满足你循环执行100次的性能要求。
内容的提问来源于stack exchange,提问作者ChaimG
相关产品推荐
相关产品推荐

