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
Ответы
Ответ 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 не равно самому себе.