一个初学者的问题:我正在尝试从数据帧计算列中的平均值,但出于某种原因,尽管使用了np.nanmean,但它给了我错误的结果(即它计算分母内的零)。
由于我不知道如何将表格粘贴到这个问题中(任何建议都很棒!),这里是我遇到的问题的一个例子:
22.0
0
0
0
35
这应该给我28.5的平均值,但是当我输入时:
np.nanmean(df)
它只返回11.4。
现在我已经尝试了轴设置,并尝试将我的0设置为numpy NaN,但两者似乎都没有效果。
除了手动执行此操作之外,在numpy / panda库中是否有一些直截了当的内容?
答案 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