Подтвердить что ты не робот

Numpy isnan() терпит неудачу в массиве float (от pandas применяется DataFrame)

У меня есть массив поплавков (некоторые нормальные числа, некоторые nans), которые выходят из приложения на pandas фреймворке данных.

По какой-то причине numpy.isnan терпит неудачу в этом массиве, однако, как показано ниже, каждый элемент является float, 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
4b9b3361

Ответ 1

np.isnan может применяться к массивам NumPy собственного типа dtype (например, 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 - он может принимать массивы 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 также считается нулевым значением в массивах объектов.

Ответ 2

В ответ на @unubtu вы можете принудительно использовать массив объектов pandas numpy для родного (float64) типа, что-то вдоль строки

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

Укажите ошибки = "принуждение", чтобы заставить строки, которые не могут быть проанализированы с числовым значением, чтобы стать NaN. Тип столбца будет dtype: float64, а затем isnan проверка должна работать

Ответ 3

Отличная замена для 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 не равно самому себе.