如何在Pandas中按组批量计算指定列的加权平均值
Pandas 按组批量计算指定列的加权平均值
要高效批量处理多列的分组加权平均,核心思路是利用向量化运算替代循环,直接对目标列整体做加权计算后再按组聚合,避免逐列处理后合并的低效操作。
实现步骤与代码
1. 构造示例数据(模拟你的场景)
import pandas as pd import numpy as np np.random.seed(42) df = pd.DataFrame({ 'group': np.repeat(['A', 'B', 'C'], 10), 'weight': np.random.rand(30), **{f'x{i}': np.random.rand(30) for i in range(1, 1000)} })
2. 高效批量加权平均函数
下面的函数采用向量化运算,一次性处理所有指定列,性能远优于循环:
def weighted_mean_by_group(df, group_col, weight_col, value_cols): # 扩展权重维度,和值列对齐(方便逐列相乘) weights = df[weight_col].values[:, np.newaxis] # 计算所有目标列的加权值(列 × 权重) weighted_values = df[value_cols] * weights # 按组聚合:分别计算加权值的总和、权重的总和 group_weighted_sum = weighted_values.groupby(df[group_col]).sum() group_total_weight = df.groupby(group_col)[weight_col].sum() # 计算加权平均值:加权和 ÷ 权重总和 return group_weighted_sum.div(group_total_weight, axis=0)
3. 使用示例
指定任意列列表即可批量计算:
# 示例目标列 target_cols = ['x11','x12','x16','x77'] # 得到分组加权平均结果 weighted_means = weighted_mean_by_group(df, 'group', 'weight', target_cols) print(weighted_means)
为什么这个方法高效?
- 避免了循环遍历每一列再合并结果的操作,直接对所有目标列做向量化运算,Pandas会底层优化计算效率
- 仅做两次groupby聚合(加权和、权重和),比逐列聚合的开销小得多,尤其是当列数多达几百列(比如x1到x999)时,性能差距会非常明显
如果需要在结果中保留每组的权重总和,可以用join合并:
group_total_weight = df.groupby('group')['weight'].sum().rename('total_weight') final_result = weighted_means.join(group_total_weight)
内容的提问来源于stack exchange,提问作者PingPong
相关产品推荐
相关产品推荐

