在Python中查找特定类的属性的均值

时间:2016-02-25 06:10:07

标签: python numpy nan mean

我试图编写一个函数来查找属于仅属于特定类的值的属性的平均值。

以下是我的代码:

`mean=0
total=0
count=0
for i in range(len(training_data)):
    if (training_data[i,334])==0:
        if training_data[i,2]<>None:
            total+=training_data[i,2]
            count+=1
    mean=total/count`

但是,我的属性中有一些空值。我正在使用numpy,并且空值被编码为&#34; NaN&#34;。在我上面的函数中,即使我特别指定值不能等于&#34;无&#34;,这是Python相当于null,我的&#34;总计&#34;属性继续显示为&#39; nan&#39;。我已经尝试了很多不同的等价物#34;无&#34;除了&#39; nan&#39;之外,还无法获得总变量的值。我有什么明显的遗失吗?提前谢谢!

2 个答案:

答案 0 :(得分:1)

凭借numpy的强大功能,您的代码可以修剪为2行:

idx = training_data[:,334] == 0
mean = np.nanmean(training_data[idx, 2])

idx这里是布尔数组,对于属于特定类的行的索引是Truenp.nanmean计算忽略NaN的平均值。

答案 1 :(得分:0)

首先,this answer中建议的numpy解决方案更适合于循环。

在这里,我将回答明确的问题:

  

[我]无法获得除'nan'之外的总变量的值。有什么明显的东西我不见了吗?

您无法直接比较nan。表达式np.nan != np.nan始终会生成Truenp.nan == np.nan始终会生成False。换句话说, nan不等于它自己

这意味着,如果您使用==!=来检查nan,则代码认为该值不是nan并将其添加到结果中。当你向任何东西添加nan时,结果就是nan,这就是你得到的。

要正确检查值是否为nan,您可以使用math.isnan()np.isnan()

编辑:我假设数据中的NaN值被编码为nan。实际上,这个问题并不完全清楚。如果它们被编码为"nan"字符串或None,则需要稍微不同的处理。