np.nanmean在数据范围内不起作用



一个初学者的问题:我正在尝试计算来自数据框的列中的平均值,但是由于某种原因,尽管使用了np.nanmean,但它给我带来了错误的结果(即,是计算分母中的零)。

我不知道如何将表粘贴到这个问题中(任何建议都很好!),这是我遇到的问题的一个例子:

22.0
0
0
0
35

这应该给我28.5的平均值,但是当我放入时:

np.nanmean(df) 

它仅返回11.4。

现在,我已经尝试了轴设置,并试图将我的0设置为numpy nans,但似乎都没有用。

除了手动执行此操作外,我在numpy/panda库中是否忽略了一些东西?

在此处留下@johne的评论,作为此帖子的合适序言。

您从根本上误解了Nan,这意味着"不是数字" 例如缺少数据或无效操作的结果(例如 由零)。零是一个有效的数字(例如黑色是有效的颜色,我想 ;-)诚然,零可以用python解释为false 数字被隐式视为布尔人,但总的来说, 零是有效的数字,当然被认为有效 含义,最大等数值方法


我认为,一个好的解决方案将涉及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行,然后拨打均值。

s[s != 0].mean()
28.5

或者,在values上调用mean。这应该更快。

i = s.values
i[i != 0].mean()
28.5

似乎您需要将0替换为NaN S并获得mean S:

print (np.nanmean(df.replace(0,np.nan)))
28.5

省略了熊猫NaN s:

print (df)
      a
0  22.0
1   0.0
2   0.0
3   0.0
4  35.0
print (df.replace(0,np.nan).mean())
a    28.5
dtype: float64

最新更新