np.nanmean不在Dataframe中工作?

问题描述 投票:2回答:2

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

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

22.0
0
0
0
35

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

np.nanmean(df) 

它只返回11.4。

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

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

python pandas numpy mean nan
2个回答
3
投票

离开@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
投票

看来你需要将0替换为NaNs并获得means:

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

在pandas qazxsw pois中省略:

NaN
© www.soinside.com 2019 - 2024. All rights reserved.