Numpy isnan () виходить з ладу в масиві плаваючих значень (застосовується від pandas dataframe)


100

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

З якоїсь причини 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

Відповіді:


162

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 об'єктів або власних dtypes:

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

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 чи пандами. Просто використовуйте import numpy as np; a = np.array([1,2,3, np.nan])та запустіть свій код.
MSeifert

@MSeifert er, я новачок у numpy, але код працював нормально, помилки не сталося
Стейтхем

У [1]: імпортувати numpy як np У [2]: a = np.array ([1,2,3, np.nan]) У [3]: надрукувати [1. 2. 3. nan] У [ 4]: надрукувати a [3] == a [3] False
Стейтхем

10

Зверху на відповідь @unutbu ви можете примусити масив об’єктів pandas numpy до рідного (float64) типу, щось уздовж лінії

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

Вкажіть error = 'coerce', щоб змусити рядки, які неможливо проаналізувати на числове значення, стати NaN. Тип стовпця буде dtype: float64, і тоді isnanперевірка повинна працювати


Здається, його ім’я unutbu;)
Dr_Zaszuś

@ Dr_Zaszuś Дякую, виправлено
Северин Паппаде

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.