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

如何高效计算数据集子集的加权平均值?Pandas优化方案

高效计算分组加权平均值

我有一个大型数据集,需要计算按spot分组后的子集加权平均值。当前用.apply实现的方案虽然能运行,但速度极慢(处理数据需数十分钟),希望找到更高效的解决方案。之前考虑过使用DataFrame.agg,但不知道如何指定第二列作为权重。

原实现方案

原代码通过循环列+groupby.apply构建结果:

def weighted(df):
    grouped = df.groupby('spot')
    result = pd.DataFrame()
    for column in df.columns:
        result[column] = grouped.apply(weighted_average, column, 'weight')
    return result


def weighted_average(df, target_column, weight_column):
    """用指定列作为权重,计算目标列的加权平均值
    输入:
        DataFrame
        目标列名称(字符串)
        权重列名称(字符串)
    输出:
        float, 目标列的加权平均值 """
    return sum(df[weight_column] * df[target_column]) / df[weight_column].sum()

优化方案(速度提升100倍)

通过transform计算分组权重总和,先逐行计算加权归一化值,再分组求和。用1/250的数据集测试时,速度提升了100倍:

def tot_weighting(df, weight_column, list_of_columns):
    norm = df.groupby('spot')[weight_column].transform('sum')
    for column in list_of_columns:
         df[column] = df[weight_column] * df[column]/norm
    result = df.groupby('spot').agg('sum')
    return result

内容的提问来源于stack exchange,提问作者Alice

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:01:08