一个初学者的问题:我正在尝试计算来自数据框的列中的平均值,但是由于某种原因,尽管使用了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