【问题标题】:Finding a Mean of an Attribute for a Specific Class in Python在 Python 中查找特定类的属性均值
【发布时间】:2016-06-07 18:38:35
【问题描述】:

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

下面是我的代码:

`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,并且空值被编码为“NaN”。在我上面的函数中,即使我特别指定该值不能等于“None”,这在 Python 中相当于 null,但我的“total”属性仍然显示为“nan”。我尝试了许多不同的“无”等价物,但无法获得除“nan”以外的总变量的值。我有什么明显的遗漏吗?提前谢谢!

【问题讨论】:

  • 以交互方式尝试 None 测试;您可能需要使用is None 或is not None。同样先用小表达式测试nan。

标签: python numpy nan mean


【解决方案1】:

首先,this answer 中建议的 numpy 解决方案优于 for 循环。

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

[I] 无法获得除 'nan' 之外的总变量的值。我有什么明显的遗漏吗?

您不能直接比较nans。表达式np.nan != np.nan 总是导致True 和np.nan == np.nan 总是导致False。换句话说,nan 不等于它自己。

这意味着,如果您使用 == 或 != 检查 nan,代码会认为该值不是 nan 并将其添加到结果中。当您将 nan 添加到任何内容时,结果就是 nan,这就是您得到的。

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

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

【讨论】:

    【解决方案2】:

    借助numpy 的强大功能,您的代码可以缩减为 2 行:

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

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

    【讨论】:

    • 感谢您的帮助!
    猜你喜欢
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多