Numpy isnan()在浮点数组上失败(来自熊猫数据框应用)

我有一个浮点数组(一些普通数字,一些浮点数) ,它来自于一个熊猫数据框的应用程序。

由于某种原因,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
179620 次浏览

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

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''

既然你有熊猫,你可以使用 pd.isnull代替——它可以接受对象或原生 dtype 的 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在对象数组中也被认为是空值。

在@unutbu 回答的顶部,您可以强制熊猫 numpy 对象数组为原生(float64)类型,类似这样的类型

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

指定 error = ‘ coance’以强制将无法解析为数值的字符串转换为 NaN。列类型将是 dtype: float64,然后 isnan检查应该工作

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 不等于它自己。

确保您导入的 csv 文件使用熊猫

import pandas as pd


condition = pd.isnull(data[i][j])

回答这个问题提醒自己,我花了一整天才解出来。 在深入研究代码之后,我发现在 _encodepy.py中:

if values.dtype.kind in 'UO':
# correct branch
else
# wrong branch, if in this branch whatever data you give it will produce the error
if np.isnan(known_values).any(): # here is problematic line

所以解决方案很简单,就是用 astype你的数据和 np.object