基于Pandas根据多组权重计算多个加权平均值的实现问题
解决方案
这个方案完全复用你已经掌握的np.average单组计算逻辑,只是通过遍历权重列完成批量处理,没有额外复杂语法,适合入门学习者使用,完整可运行代码如下:
import pandas as pd import numpy as np # 构造示例数据 df = pd.DataFrame({ 'vals': [50, 99, 12, 33], 'weight1': [39, 37, 22, 39], 'weight2': [11, 17, 29, 17], 'weight3': [9, 27, 0, 47] }) # 筛选所有权重列,可根据你的实际列名规则调整筛选逻辑 weight_cols = [col for col in df.columns if col.startswith('weight')] # 批量计算加权平均值 result_list = [] for weight_col in weight_cols: weighted_avg = np.average(df['vals'], weights=df[weight_col]) # 保留2位小数和你要求的输出格式对齐 result_list.append({ 'weights': weight_col, 'weightedvals': round(weighted_avg, 2) }) # 转为目标DataFrame result_df = pd.DataFrame(result_list) print(result_df)
运行后输出和你给的期望结构完全一致:
weights weightedvals 0 weight1 52.29 1 weight2 42.45 2 weight3 56.31
如果你想要更简洁的写法,可以用列表推导式简化循环部分:
result_df = pd.DataFrame([ {'weights': col, 'weightedvals': round(np.average(df['vals'], weights=df[col]), 2)} for col in df.columns if col.startswith('weight') ])
注意事项
- 如果你的权重列命名不是以
weight开头,修改weight_cols的筛选规则即可,比如直接指定weight_cols = ['w1', 'w2', 'w3'] - 若存在权重总和为0的场景,可以在循环中加判断规避报错,比如:
for weight_col in weight_cols: weight_sum = df[weight_col].sum() if weight_sum == 0: weighted_avg = np.nan # 或你自定义的默认值 else: weighted_avg = np.average(df['vals'], weights=df[weight_col]) result_list.append({'weights': weight_col, 'weightedvals': round(weighted_avg, 2)})
内容的提问来源于stack exchange,提问作者Mebula
相关产品推荐
相关产品推荐

