web-dev-qa-db-de.com

Pandas: Spalten mit allen NaNs löschen

Mir ist klar, dass das Löschen von NaNs 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 NaNs sowie alle Spalten mit mehr als 3 NaNs 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.

16
theprowler

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
41
Corley Brigman

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.

7

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.

3