我有一个重量系列,如下所示:
a 0.2
b 0.3
c 0.5
Run Code Online (Sandbox Code Playgroud)
和一个数据框:
a b c
1 1 2 2
2 Nan 2 2
3 Nan 1 Nan
...
Run Code Online (Sandbox Code Playgroud)
我想像这样计算数据帧的加权平均值:
(dataframe * weights).sum(axis=1)
Run Code Online (Sandbox Code Playgroud)
问题是,当数据帧的值为 Nan 时,我希望相应的权重与其他权重相等。例如,对于第二行,b 的权重应该是 0.4,c 的权重应该是 0.6。对于第三行,权重矩阵对于 b 应该是 1。
您可以将 numpy 的平均值用于掩码数组,这是专为该用例设计的。让s是重量系列和df数据框:
np.ma.average(np.ma.array(df.values, mask=df.isnull().values),
weights=s.values, axis=1)
Run Code Online (Sandbox Code Playgroud)
该.data属性包含结果:
array([ 1.8, 2. , 1. ])
Run Code Online (Sandbox Code Playgroud)
编辑:按照评论中的建议,您可以将结果转换为系列:
pd.Series(np.ma.average(np.ma.array(df.values, mask=df.isnull().values),
weights=s.values, axis=1).data, index=df.index)
Run Code Online (Sandbox Code Playgroud)