根据多个权重值计算多个加权平均值 - Pandas

Calculating multiple weighted averages based on multiple weight values - Pandas

我是 Python 的新手,我了解 np.average 的一般工作原理,但我不知道如何让它适用于我的特定应用程序。我希望根据不同的权重为 df 的一行创建不同的加权平均值。

示例如下:

df=pd.DataFrame({'vals':[50,99,12,33],
    'weight1':np.random.randint(0,50,4),
    'weight2':np.random.randint(0,50,4),
    'weight3':np.random.randint(0,50,4)})

   vals  weight1  weight2  weight3
0    50       39       11        9
1    99       37       17       27
2    12       22       29        0
3    33       39       17       47

我想创建一个列(在单独的数据框中),它对我使用的每组权重具有 'vals' 的加权平均值。

所以输出看起来像这样:

   weights  weightedvals
0  weight1         52.29
1  weight2         42.45
2  weight3         56.31

我了解如何单独获得这些加权平均值,例如

average(df['vals'], weights = df['weight1'])

但我对如何针对多个权重值执行此操作感到困惑。我已经尝试了一些解决方案,但它们更适用于对多列使用相同的权重。

谢谢!!

您可能正在寻找生成器对象,如下所示:

[np.average(df['vals'], weights=df[w]) for w in df.columns[1:]]

将生成一个元素列表,其中第一个元素对应于使用 'weight1' 的平均值,第二个元素对应于 'weight2' 等等。您可以将其作为压缩的 for 循环来阅读,尽管它比使用 for 循环并将值附加到列表要快得多。 df.columns 只是列名列表,因此 df.columns[1:] 是省略第一个元素的列名列表。

所以要获得您正在寻找的输出

avg = [np.average(df['vals'], weights=df[w]) for w in df.columns[1:]]
avg_df = pd.DataFrame({'weights' : df.columns[1:], 'weightedvals' : avg})