Je me rends compte que supprimer NaN
s 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 NaN
s ainsi que toutes les colonnes avec plus de 3 NaN
s (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.
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
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.
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.