Numpy isnan()在浮点数组上失败(适用于pandas数据框)


100

我有一个浮点数数组(一些正常数字,一些nans),它们是从对熊猫数据框的应用中得出的。

由于某种原因,numpy.isnan在此数组上失败,但是,如下所示,每个元素都是浮点数,numpy.isnan在每个元素上正确运行,变量的类型肯定是一个numpy数组。

这是怎么回事?!

set([type(x) for x in tester])
Out[59]: {float}

tester
Out[60]: 
array([-0.7000000000000001, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan], dtype=object)

set([type(x) for x in tester])
Out[61]: {float}

np.isnan(tester)
Traceback (most recent call last):

File "<ipython-input-62-e3638605b43c>", line 1, in <module>
np.isnan(tester)

TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

set([np.isnan(x) for x in tester])
Out[65]: {False, True}

type(tester)
Out[66]: numpy.ndarray

Answers:


162

np.isnan 可以应用于本机dtype的NumPy数组(例如np.float64):

In [99]: np.isnan(np.array([np.nan, 0], dtype=np.float64))
Out[99]: array([ True, False], dtype=bool)

但是在应用于对象数组时引发TypeError:

In [96]: np.isnan(np.array([np.nan, 0], dtype=object))
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

由于您拥有Pandas,pd.isnull因此可以改用-它可以接受对象或本机dtypes的NumPy数组:

In [97]: pd.isnull(np.array([np.nan, 0], dtype=float))
Out[97]: array([ True, False], dtype=bool)

In [98]: pd.isnull(np.array([np.nan, 0], dtype=object))
Out[98]: array([ True, False], dtype=bool)

请注意,None在对象数组中也将其视为空值。


3
谢谢-使用pd.isnull()。似乎也不会影响性能。
tim654321 '16

11

np.isnan()和pd.isnull()的绝佳替代品是

for i in range(0,a.shape[0]):
    if(a[i]!=a[i]):
       //do something here
       //a[i] is nan

因为只有nan不等于自己。


可能不适用于数组,因为它引发了众所周知的“ ValueError:xxx的真值不明确”。
MSeifert

@MSeifert您在谈论python吗?我只是使用这种方法在机器学习中做某事,为什么没有遇到众所周知的错误?
斯坦森

是的,似乎您以前从未使用过numpy或pandas。只需使用import numpy as np; a = np.array([1,2,3, np.nan])并运行您的代码。
MSeifert

@MSeifert er,我是numpy的新手,但代码运行正常,没有错误发生
Statham

在[1]中:将numpy导入为np在[2]中:a = np.array([1,2,3,np.nan])在[3]中:打印一个[1. 2. 3. nan]在[ 4]:打印a [3] == a [3]错误
Statham

10

在@unutbu答案的顶部,您可以将pandas numpy对象数组强制转换为本机(float64)类型,沿线进行操作

import pandas as pd
pd.to_numeric(df['tester'], errors='coerce')

指定errors ='coerce'强制将无法解析为数字值的字符串变为NaN。列类型为dtype: float64,然后isnan检查是否可以使用


他的名字似乎是unutbu;)
Dr_Zaszuś

@Dr_Zaszuś谢谢,固定
Severin Pappadeux

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.