You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:31:34