Mir ist klar, dass das Löschen von NaN
s aus einem Datenrahmen so einfach ist wie df.dropna
aber aus irgendeinem Grund funktioniert das bei mir nicht und ich bin mir nicht sicher warum.
Hier ist mein ursprünglicher Datenrahmen:
fish_frame1: 0 1 2 3 4 5 6 7
0 #0915-8 NaN NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN LIVE WGT NaN AMOUNT NaN TOTAL
2 GBW COD NaN NaN 2,280 NaN $0.60 NaN $1,368.00
3 POLLOCK NaN NaN 1,611 NaN $0.01 NaN $16.11
4 WHAKE NaN NaN 441 NaN $0.70 NaN $308.70
5 GBE HADDOCK NaN NaN 2,788 NaN $0.01 NaN $27.88
6 GBW HADDOCK NaN NaN 16,667 NaN $0.01 NaN $166.67
7 REDFISH NaN NaN 932 NaN $0.01 NaN $9.32
8 GB WINTER FLOUNDER NaN NaN 145 NaN $0.25 NaN $36.25
9 GOM WINTER FLOUNDER NaN NaN 25,070 NaN $0.35 NaN $8,774.50
10 GB YELLOWTAIL NaN NaN 26 NaN $1.75 NaN $45.50
Der folgende Code ist ein Versuch, alle NaN
s sowie alle Spalten mit mehr als 3 NaN
s zu löschen (entweder eine oder beide sollten funktionieren, denke ich):
fish_frame.dropna()
fish_frame.dropna(thresh=len(fish_frame) - 3, axis=1)
Dies erzeugt:
fish_frame1 after dropna: 0 1 2 3 4 5 6 7
0 #0915-8 NaN NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN LIVE WGT NaN AMOUNT NaN TOTAL
2 GBW COD NaN NaN 2,280 NaN $0.60 NaN $1,368.00
3 POLLOCK NaN NaN 1,611 NaN $0.01 NaN $16.11
4 WHAKE NaN NaN 441 NaN $0.70 NaN $308.70
5 GBE HADDOCK NaN NaN 2,788 NaN $0.01 NaN $27.88
6 GBW HADDOCK NaN NaN 16,667 NaN $0.01 NaN $166.67
7 REDFISH NaN NaN 932 NaN $0.01 NaN $9.32
8 GB WINTER FLOUNDER NaN NaN 145 NaN $0.25 NaN $36.25
9 GOM WINTER FLOUNDER NaN NaN 25,070 NaN $0.35 NaN $8,774.50
10 GB YELLOWTAIL NaN NaN 26 NaN $1.75 NaN $45.50
Ich bin ein Anfänger mit Pandas
, daher bin ich mir nicht sicher, ob dies nicht funktioniert, weil ich etwas falsch mache oder etwas falsch verstehe oder einen Befehl missbrauche. Jede Hilfe wird geschätzt, danke.
Aus dem dropna
docstring:
# drop the columns where all elements are NaN:
>>> df.dropna(axis=1, how='all')
A B D
0 NaN 2.0 0
1 3.0 4.0 1
2 NaN NaN 5
dropna()
löscht die Nullwerte und gibt einen Datenrahmen zurück. Weisen Sie es wieder dem ursprünglichen Datenrahmen zu.
fish_frame = fish_frame.dropna(axis = 1, how = 'all')
Verweis auf Ihren Code:
fish_frame.dropna(thresh=len(fish_frame) - 3, axis=1)
Dies würde Spalten mit 7 oder mehr NaNs löschen (vorausgesetzt, len (df) = 10). Wenn Sie Spalten mit mehr als 3 Nans löschen möchten, wie Sie erwähnt haben, sollte der Schwellenwert gleich 3 sein.
dropna()
gibt standardmäßig einen Datenrahmen zurück (standardmäßig inplace=False
Verhalten) und muss daher einem neuen Datenrahmen zugewiesen werden, damit er in Ihrem Code verbleibt.
So zum Beispiel
fish_frame = fish_frame.dropna()
Um zu erklären, warum Ihr dropna
einen leeren Datenrahmen zurückgibt, empfehlen wir Ihnen, das Argument "wie" in der dropna-Methode ( https://pandas.pydata.org/pandas-docs) zu lesen /stable/generated/pandas.DataFrame.dropna.html ). Beachten Sie auch, dass Achse = 0 Spalten und Achse = 1 Zeilen entspricht.
Um also Spalten mit allen "NAs" zu entfernen, sollte axis = 0, how = "any" den Trick machen:
fish_frame = fish_frame.dropna(axis=0, how="any")
Schließlich gibt das Argument "Thresh" explizit an, wie viele NAs erforderlich sind, damit ein Drop auftritt. So
fish_frame = fish_frame.dropna(axis=0, thresh=3, how="any")
sollte gut und gut funktionieren, um jede Spalte mit drei NAs zu entfernen.
Wie Corley betonte, ist how = "any" die Standardeinstellung und daher nicht erforderlich.