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” :
Po latach używania [NaN] okazało się, przynajmniej moim zdaniem, najlepszą decyzją, biorąc pod uwagę ogólny stan rzeczy w NumPy i Pythonie. Szczególna wartość NaN (Not-A-Number) jest stosowany wszędzie jako wartość NA, i istnieją funkcje API isnull
i notnull
które mogą być wykorzystywane w poprzek dtypes wykryć wartości nA.
...
W związku z tym wybrałem podejście Pythonic „praktyczność przewyższa czystość” i wymieniłem zdolność NA liczb całkowitych, aby uzyskać znacznie prostsze podejście polegające na użyciu specjalnej wartości w tablicach zmiennoprzecinkowych i obiektowych do oznaczania NA oraz promowaniu tablic całkowitych na zmienne, gdy NA muszą być wprowadzone.
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 .
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):
np.nan
pozwala na operacje wektoryzowane; jego wartość zmiennoprzecinkowa, podczas gdy None
z definicji wymusza typ obiektu, co w zasadzie wyłącza całą wydajność w numpy.
Więc powtórz szybko 3 razy: object == bad, float == good
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
i pd.notnull
sprawdzać brakujące dane (NaN).
qwerty
nie jest liczbą.