一个初学者的问题:我试图从数据帧计算列中的平均值,但出于某种原因,尽管使用了np.nanmean,但它给了我错误的结果(即它计算分母内的零)。
因为我不知道如何将表格粘贴到这个问题中(任何建议都会很棒!),这里是我遇到的问题的一个例子:
22.0
0
0
0
35
这应该给我28.5的平均值,但是当我输入时:
np.nanmean(df)
它只返回11.4。
现在我已经尝试了轴设置,并尝试将我的0设置为numpy NaNs,但两者似乎都没有效果。
除了手动执行此操作之外,在numpy / panda库中是否有一些直截了当的东西?
离开@JohnE的这个comment,作为这篇文章的合适序言。
你从根本上误解了nan,这意味着“不是数字”,比如缺失数据或无效操作的结果(例如除以零)。零是一个有效的数字(就像黑色是一种有效的颜色,我猜;-)诚然,当数字被隐含地视为布尔值时,零可以被解释为假,但一般来说,零是有效数字,当然被认为是有效的对于任何数值方法,如均值,最大值等
在我看来,一个好的解决方案将涉及mask
-
s
0 22.0
1 0.0
2 0.0
3 0.0
4 35.0
Name: 0, dtype: float64
s.mask(s.eq(0)).mean()
28.5
要么,
np.nanmean(s.mask(s.eq(0)).values)
28.5
这个解决方案的优点是它适用于Series
以及DataFrame
对象。
如果您有一系列(或单列数据帧),则解决方案会简化。你可以执行布尔索引来摆脱0
行,然后调用mean。
s[s != 0].mean()
28.5
或者,在mean
上打电话给values
。这应该快得多。
i = s.values
i[i != 0].mean()
28.5
看来你需要将0
替换为NaN
s并获得mean
s:
print (np.nanmean(df.replace(0,np.nan)))
28.5
在pandas qazxsw pois中省略:
NaN