如何高效计算数据集子集的加权平均值?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
相关产品推荐
相关产品推荐

