繁体   English   中英

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

[英]How to handle Nan values when computing weighted mean

我有一个如下的权重系列:

a  0.2
b  0.3
c  0.5

和一个数据框:

   a    b   c
1  1    2   2
2  Nan  2   2
3  Nan  1   Nan
...

我想像这样计算数据帧的加权平均值:

(dataframe * weights).sum(axis=1) 

问题是,当数据帧的值为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)

.data属性包含结果:

array([ 1.8,  2. ,  1. ])

编辑 :根据注释中的建议,您可以将结果转换为一系列:

pd.Series(np.ma.average(np.ma.array(df.values, mask=df.isnull().values), 
                        weights=s.values, axis=1).data, index=df.index)

首先,您可以制作一个调整后的权重矩阵

df2 = dataframe.copy()
df2[pd.notnull(df2)] = 1
df2 = df2 * weight
df2 = df2.multiply(1/df2.sum(axis=1), axis=0)
df2

得出这个维格矩阵

    a   b   c
row             
1   0.2     0.300   0.500
2   NaN     0.375   0.625
3   NaN     1.000   NaN

然后(df2 * dataframe).sum(axis=1)导致

row
1    1.8
2    2.0
3    1.0
dtype: float64

使用DafaFrame.where()可以更快地完成此操作

df2 = dataframe.where(pd.isnull,1) * weight
result = (df2.multiply(1 / df2.sum(axis=1), axis=0) * dataframe).sum(axis=1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM