web-dev-qa-db-fra.com

Pandas: déposez des colonnes avec tous les NaN

Je me rends compte que supprimer NaNs d'une trame de données est aussi simple que df.dropna mais pour une raison quelconque, cela ne fonctionne pas sur le mien et je ne sais pas pourquoi.

Voici mon dataframe d'origine:

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

Le code qui suit est une tentative de supprimer tous les NaNs ainsi que toutes les colonnes avec plus de 3 NaNs (l'un ou les deux devraient fonctionner je pense):

fish_frame.dropna()
fish_frame.dropna(thresh=len(fish_frame) - 3, axis=1)

Cela produit:

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

Je suis novice avec Pandas donc je ne sais pas si cela ne fonctionne pas parce que je fais quelque chose de mal ou que je comprends mal quelque chose ou que j'utilise mal une commande. Toute aide est la bienvenue, merci.

6
theprowler

A partir de la docstring dropna:

    # 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
19
Corley Brigman

dropna() supprime les valeurs nulles et retourne un dataFrame. Attribuez-le à nouveau au dataFrame d'origine.

fish_frame = fish_frame.dropna(axis = 1, how = 'all')

En vous référant à votre code:

fish_frame.dropna(thresh=len(fish_frame) - 3, axis=1)

Cela supprimerait des colonnes avec 7 NaN ou plus (en supposant que len (df) = 10), si vous voulez supprimer des colonnes avec plus de 3 Nan comme vous l'avez mentionné, thresh devrait être égal à 3.

3
Rakesh Adhikesavan

dropna() par défaut renvoie une trame de données (par défaut à inplace=False comportement) et doit donc être affecté à un nouveau dataframe pour qu'il reste dans votre code.

Ainsi, par exemple,

fish_frame = fish_frame.dropna()

Quant à savoir pourquoi votre dropna renvoie une trame de données vide, je vous recommande de regarder l'argument "comment" dans la méthode dropna ( https://pandas.pydata.org/pandas-docs /stable/generated/pandas.DataFrame.dropna.html ). Gardez également à l'esprit que l'axe = 0 correspond aux colonnes et l'axe = 1 correspond aux lignes.

Donc, pour supprimer les colonnes avec tous les "NA", axis = 0, comment = "any" devrait faire l'affaire:

fish_frame = fish_frame.dropna(axis=0, how="any")

Enfin, l'argument "thresh" désigne explicitement le nombre de NA nécessaires pour qu'une baisse se produise. Donc

fish_frame = fish_frame.dropna(axis=0, thresh=3, how="any") 

devrait fonctionner correctement et dandy pour supprimer toute colonne avec trois NA.

En outre, comme l'a souligné Corley, how = "any" est la valeur par défaut et n'est donc pas nécessaire.

2
SeeDerekEngineer