![](/img/trans.png)
[英]How is ewm mean calculated when nan values are present and adjust=false?
[英]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.