Ich suchte ein bisschen und konnte es nicht finden, also gelang es mir herauszufinden, wie ich es löschen sollte, also mach dir eine Notiz.
Das Thema lautet "Gibt es NaN im Pandas DataFrame?"
Um zu überprüfen, ob die Daten ordnungsgemäß verarbeitet werden, möchte ich ** herausfinden, ob und wo sich ein NaN-Wert im Datenrahmen befindet **.
Wenn Sie NaN füllen / löschen möchten, können Sie fillna ()
/ dropna ()
verwenden. Jetzt möchten Sie jedoch ** "überprüfen, ob NaN vorhanden ist, und die Zeile (Spalte) anzeigen. ** **.
Als Beispiel möchte ich nur die 2.-4. Zeile oder 1-3. Spalte dieses Datenrahmens extrahieren.
Datenerstellung
df=pd.DataFrame(np.random.randn(5,5))
df.ix[2:, 1:3] = np.nan
df.columns=list('abcde')
df
#[Out]# a b c d e
#[Out]# 0 -0.678873 -1.277486 -1.062232 0.097525 -2.386115
#[Out]# 1 -1.063709 -1.919997 -0.131733 -0.606348 0.101888
#[Out]# 2 -1.701473 NaN NaN NaN 0.201468
#[Out]# 3 -0.624932 NaN NaN NaN -0.654297
#[Out]# 4 0.345065 NaN NaN NaN -0.232199
Verwenden Sie isnull () / notnull (), um festzustellen, ob NaN vorhanden ist. Referenz unten
Umgang mit NaN durch Pandas Official: Dokumentation zu Pandas 0.19.1 »Arbeiten mit fehlenden Daten
Verwenden Sie die isnull-Methode
isnull()
df.isnull()
#[Out]# a b c d e
#[Out]# 0 False False False False False
#[Out]# 1 False False False False False
#[Out]# 2 False True True True False
#[Out]# 3 False True True True False
#[Out]# 4 False True True True False
Was zurückgegeben wird, ist ein Datenrahmen, der dieselbe Größe wie df hat und einen Bool-Wert enthält. Nur bei NaN wahr.
notnull () ist die Umkehrung von True / False des von isnull () zurückgegebenen Datenrahmens.
Das ist ein bisschen anders als das, was ich machen möchte
Was ich tun möchte ** "Überprüfen Sie, ob NaN vorhanden ist, und zeigen Sie die Zeile (Spalte) an" ** Wenn zerlegt
Ich frage mich, ob es so sein wird.
** Es gibt mehr als einen Honyalara ** Apropos ** Numpys "beliebige" Methode **
np.any()
df.isnull().any()
#[Out]# a False
#[Out]# b True
#[Out]# c True
#[Out]# d True
#[Out]# e False
#[Out]# dtype: bool
df.isnull().any(axis=1)
#[Out]# 0 False
#[Out]# 1 False
#[Out]# 2 True
#[Out]# 3 True
#[Out]# 4 True
#[Out]# dtype: bool
df.isnull().any(axis=0) # df.isnull().any()Gleich wie
#[Out]# a False
#[Out]# b True
#[Out]# c True
#[Out]# d True
#[Out]# e False
#[Out]# dtype: bool
Da die Standardabtastrichtung von "any ()" die Zeilenrichtung (Achse = 0) ist, ist "df.isnull (). Any ()" eine Konvertierung durch "True" (isnull (), dh "NaN") in der Spalte. Gibt "True" zurück, wenn mehr als eine enthalten ist, / "False", wenn nicht. Wenn Sie eine (Achse = 1) festlegen, wird die Scanrichtung geändert und die Spaltenrichtung (Achse = 1) wird danach durchsucht, ob "True" (dh "NaN") enthalten ist.
axis =
kann weggelassen werden, daher ist das Schreiben vondf.isnull (). Any (1)
dasselbe wiedf.isnull (). Any (axis = 1)
.
Es ist ein wenig anders als das, was ich tun möchte, und damit es ** True zurückgibt, wenn sich an einer Stelle NaN befindet **, überlappen Sie alle.
Enthält es auch nur ein NaN?
df.isnull().any().any() #Enthält NaN
#[Out]# True
dff=pd.DataFrame(np.random.randn(5,5)) #Enthält kein NaN
dff.isnull().any().any()
#[Out]# False
Ich habe das gleiche für den Stapelüberlauf getan. stack overflow - Python pandas: check if any value is NaN in DataFrame Neben df.any (). Any ()
Ich benutze es. Die schnellste Zeit, gemessen mit "% timeit", war "df.isnull (). Values.any ()". ** Wenn Sie wissen möchten, ob auch nur ein NaN enthalten ist **, verwenden Sie es.
Ich kann endlich machen was ich will.
Mit df.isnull (). Any (1)
können Sie einen Bool-Wert erstellen, um festzustellen, ob die Zeile NaN enthält, sie in Scheiben schneiden ** und nur die Spalten extrahieren, die NaN enthalten.
Linienextraktion einschließlich NaN
df[df.isnull().any(1)]
#[Out]# a b c d e
#[Out]# 2 -1.701473 NaN NaN NaN 0.201468
#[Out]# 3 -0.624932 NaN NaN NaN -0.654297
#[Out]# 4 0.345065 NaN NaN NaN -0.232199
Zeilenextraktion einschließlich NaN
df.ix[:,df.isnull().any()]
#[Out]# b c d
#[Out]# 0 -1.277486 -1.062232 0.097525
#[Out]# 1 -1.919997 -0.131733 -0.606348
#[Out]# 2 NaN NaN NaN
#[Out]# 3 NaN NaN NaN
#[Out]# 4 NaN NaN NaN
das ist alles!
Es scheint einen einfacheren Weg zu geben, aber nicht wahr? Lass es mich wissen, bitte.
Während die Extraktion nur der Pandas-Zeilen "loc", "iloc" hat, hat die Extraktion von Spalten "df.
Update 15.04.2017
Extrahieren Sie die dritte Zeile mit "df.icol (3)"
Extrahieren Sie die 0. und 2. Spalte mit df.icol ([0,2])
In df.icol ([0: 2])
werden die 0., 1. und 2. Spalte ** nicht extrahiert und fehlerhaft **
Ich habe einen Geschwindigkeitsvergleich im Kommentarbereich gepostet.
Recommended Posts