计算加权平均值时如何处理 Nan 值

xro*_*ro7 0 python pandas

我有一个重量系列,如下所示:

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。

Ian*_*anS 5

您可以将 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)