np.nanmean不在Dataframe中工作?

时间:2017-12-20 09:59:44

标签: python pandas numpy mean nan

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

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

22.0
0
0
0
35

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

np.nanmean(df) 

它只返回11.4。

现在我已经尝试了轴设置,并尝试将我的0设置为numpy NaN,但两者似乎都没有效果。

除了手动执行此操作之外,在numpy / panda库中是否有一些直截了当的内容?

2 个答案:

答案 0 :(得分:3)

将此comment从@JohnE留在此处,作为此帖的合适序言。

  

你从根本上误解了nan,这意味着"不是数字"   喜欢丢失数据或无效操作的结果(例如除法   零)。零是有效数字(我想是黑色是有效的颜色   ;-)诚然,零时可以将零解释为false   数字被隐含地视为布尔值,但一般来说,   零是有效数字,当然被认为对任何有效   像mean,max等数值方法

在我看来,一个好的解决方案将涉及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

答案 1 :(得分:0)

您似乎需要将0替换为NaN并获取mean s:

print (np.nanmean(df.replace(0,np.nan)))
28.5
pandas NaN中的

被省略:

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