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
tim654321
źródło

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.

unutbu
źródło
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.

Statham
źródło
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ć

Severin Pappadeux
źródło
Nazywa się unutbu;)
Dr_Zaszuś
@ Dr_Zaszuś Dzięki, naprawiono
Severin Pappadeux
1

Upewnij się, że importujesz plik CSV za pomocą Pandas

import pandas as pd

condition = pd.isnull(data[i][j])
Dariswan Janweri P.
źródło