Numpy isnan () nie działa na tablicy liczb zmiennoprzecinkowych (z pandy dataframe)


106

Mam tablicę liczb zmiennoprzecinkowych (kilka normalnych liczb, kilka nans), która wychodzi z zastosowania na ramce danych pandy.

Z jakiegoś powodu numpy.isnan nie działa w tej tablicy, jednak jak pokazano poniżej, każdy element jest zmiennoprzecinkowy, numpy.isnan działa poprawnie na każdym elemencie, typem zmiennej jest zdecydowanie tablica numpy.

Co się dzieje?!

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

Odpowiedzi:


167

np.isnan można zastosować do tablic NumPy o rodzimym dtype (np.float64):

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

ale wywołuje TypeError po zastosowaniu do tablic obiektów:

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

Ponieważ masz Pandy, możesz użyć pd.isnullzamiast tego - może akceptować tablice NumPy obiektów lub natywnych typów:

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)

Zwróć uwagę, że Nonew tablicach obiektów jest również uważana za wartość null.


3
Dzięki - użyto pd.isnull (). Nie wydaje się też mieć żadnego wpływu na wydajność.
tim654321

12

Świetnym zamiennikiem np.isnan () i pd.isnull () jest

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

ponieważ tylko nan nie jest sobie równe.


to może nie działać w przypadku tablic, ponieważ wywołuje dobrze znany błąd „ValueError: Prawda wartość xxx jest niejednoznaczna”.
MSeifert

@MSeifert Czy mówisz o Pythonie ? Po prostu używam tej metody, aby zrobić coś w uczeniu maszynowym, dlaczego nie napotkałem dobrze znanego błędu?
Statham

Tak, wygląda na to, że wcześniej nie używałeś numpy ani pand. Po prostu użyj import numpy as np; a = np.array([1,2,3, np.nan])i uruchom kod.
MSeifert

@MSeifert er, jestem nowy w numpy, ale kod działał poprawnie, nie wystąpił błąd
Statham

W [1]: import numpy as np W [2]: a = np.array ([1,2,3, np.nan]) W [3]: print a [1. 2. 3. nan] In [ 4]: print a [3] == a [3] False
Statham

10

Oprócz odpowiedzi @unutbu, możesz wymusić tablicę obiektów pandy numpy na typ natywny (float64), coś wzdłuż linii

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

Określ błędy = 'coerce', aby wymusić na łańcuchach, których nie można przeanalizować na wartość liczbową, na NaN. Typ kolumny to dtype: float64, a następnie isnansprawdzenie powinno działać


Nazywa się unutbu;)
Dr_Zaszuś

@ Dr_Zaszuś Dzięki, naprawiono
Severin Pappadeux

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.