根据多个权重值计算多个加权平均值 - 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})
我是 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})