Czytam dwie kolumny pliku csv za pomocą pand, readcsv()
a następnie przypisuję wartości do słownika. Kolumny zawierają ciągi cyfr i liter. Czasami zdarzają się przypadki, gdy komórka jest pusta. Moim zdaniem wartość odczytywana dla tego hasła w słowniku powinna być, None
ale zamiast tego nan
jest przypisywana. Z pewnością None
jest bardziej opisowy dla pustej komórki, ponieważ ma wartość null, podczas gdy nan
po prostu mówi, że odczytana wartość nie jest liczbą.
Czy moje rozumienie jest prawidłowe, jaka JEST różnica między None
i nan
? Dlaczego jest nan
przypisany zamiast None
?
Ponadto, mój słownik sprawdzania pustych komórek używał numpy.isnan()
:
for k, v in my_dict.iteritems():
if np.isnan(v):
Ale to daje mi błąd mówiąc, że nie mogę użyć tego czeku v
. Wydaje mi się, że dzieje się tak dlatego, że ma być używana zmienna całkowita lub zmiennoprzecinkowa, a nie ciąg. Jeśli to prawda, jak mogę sprawdzić, czy nie v
ma „pustej komórki” / nan
przypadku?
qwerty
nie jest liczbą.None
byłby lepszy opis wartości pustej komórki.Odpowiedzi:
NaN jest używany jako symbol zastępczy dla brakujących danych konsekwentnie w pandach , spójność jest dobra. Zwykle czytam / tłumaczę NaN jako „brakujący” . Zobacz także sekcję „Praca z brakującymi danymi” w dokumentacji.
Wes pisze w dokumencie „Wybór reprezentacji NA” :
Uwaga: „gotcha”, że seria liczb całkowitych zawierająca brakujące dane jest przesyłana do postaci zmiennoprzecinkowej .
Moim zdaniem głównym powodem używania NaN (zamiast None) jest to, że można go przechowywać z typem numpy float64, a nie mniej wydajnym typem obiektu, patrz promocje typu NA .
# without forcing dtype it changes None to NaN! s_bad = pd.Series([1, None], dtype=object) s_good = pd.Series([1, np.nan]) In [13]: s_bad.dtype Out[13]: dtype('O') In [14]: s_good.dtype Out[14]: dtype('float64')
Jeff komentuje to (poniżej):
Mówiąc to, wiele operacji może nadal działać równie dobrze z None i NaN (ale być może nie są obsługiwane, tj. Czasami mogą dawać zaskakujące wyniki ):
In [15]: s_bad.sum() Out[15]: 1 In [16]: s_good.sum() Out[16]: 1.0
Aby odpowiedzieć na drugie pytanie:
należy używać
pd.isnull
ipd.notnull
sprawdzać brakujące dane (NaN).źródło
np.nan
pozwala na operacje wektoryzowane; to wartość zmiennoprzecinkowa, podczas gdyNone
z definicji wymuszaobject
typ i zasadniczo wyłącza całą wydajność w numpy, więc powtórz 3 razy szybko:object==bad, float==good
<NA>
równieżnp.nan
?NaN
może być używany jako wartość liczbowa w operacjach matematycznych, podczas gdyNone
nie może (a przynajmniej nie powinien).NaN
jest wartością liczbową zdefiniowaną w standardzie zmiennoprzecinkowym IEEE 754 .None
jest wewnętrznym typem Pythona (NoneType
) i w tym kontekście bardziej przypomina „nieistniejący” lub „pusty” niż „niepoprawny numerycznie”.Głównym "symptomem" tego jest to, że jeśli wykonasz, powiedzmy, średnią lub sumę na tablicy zawierającej NaN, nawet pojedynczej, otrzymasz w rezultacie NaN ...
Z drugiej strony nie można wykonywać operacji matematycznych, używając
None
jako operandu.Tak więc, w zależności od przypadku, możesz użyć
None
jako sposobu, aby powiedzieć algorytmowi, aby nie uwzględniał nieprawidłowych lub nieistniejących wartości w obliczeniach. Oznaczałoby to, że algorytm powinien przetestować każdą wartość, aby sprawdzić, czy tak jestNone
.Numpy ma kilka funkcji, aby uniknąć wartości NaN skazić swoje wyniki, jak
nansum
inan_to_num
np.źródło
df=pd.readcsv('file.csv')
podaje miNaN
wartości dla pustych komórek, a nieNone
? O ile mi wiadomo, pd.DataFrames nie są wyłączne dla liczb.dtype
, więc nieprawidłowe wartościdtype=float
muszą być reprezentowane przez wartości liczbowe, któreNaN
są iNone
nie są (None
są zNoneType
).na
argument, który pozwala zdecydować, której wartości użyjesz do zastąpienia niedostępnych wartościFunkcja
isnan()
sprawdza, czy coś jest „nie liczbą” i zwróci, czy zmienna jest liczbą, na przykładisnan(2)
zwróci fałszWarunek
myVar is not None
zwraca, czy zmienna jest zdefiniowana, czy nieTwoja tablica numpy używa,
isnan()
ponieważ ma być tablicą liczb i inicjalizuje wszystkie elementy tablicy, abyNaN
te elementy były uważane za "puste"źródło
isnan(2)
że wrócęFalse
, ponieważ 2 nie jest NaN.numpy.empty
nie inicjalizuje wartości tablic doNaN
. Po prostu w ogóle nie inicjalizuje wartości.None
-myVar is not None
nie jestmyVar != None
.np.isnan()
nie jest zaimplementowane dla zmiennych łańcuchowych, więc jeśli przekażesz mu łańcuch, nastąpi awaria. Lepiej użyć,pd.isnull
który działa ze stringami.Poniżej przedstawiamy różnice:
nan
należy do klasyfloat
None
należy do klasyNoneType
Poniższy artykuł uważam za bardzo pomocny: https://medium.com/analytics-vidhya/dealing-with-missing-values-nan-and-none-in-python-6fc9b8fb4f31
źródło
NaN
oznacza NIE numer .None
może oznaczać jakiekolwiek .źródło