607 votes

Comment remplacer les valeurs NaN par des zéros dans une colonne d'un cadre de données Pandas ?

J'ai un Dataframe Pandas comme ci-dessous :

      itm Date                  Amount 
67    420 2012-09-30 00:00:00   65211
68    421 2012-09-09 00:00:00   29424
69    421 2012-09-16 00:00:00   29877
70    421 2012-09-23 00:00:00   30990
71    421 2012-09-30 00:00:00   61303
72    485 2012-09-09 00:00:00   71781
73    485 2012-09-16 00:00:00     NaN
74    485 2012-09-23 00:00:00   11072
75    485 2012-09-30 00:00:00  113702
76    489 2012-09-09 00:00:00   64731
77    489 2012-09-16 00:00:00     NaN

Lorsque j'essaie d'appliquer une fonction à la colonne Montant, j'obtiens l'erreur suivante :

ValueError: cannot convert float NaN to integer

J'ai essayé d'appliquer une fonction en utilisant .isnan à partir du module mathématique. J'ai essayé l'attribut pandas .replace. J'ai essayé l'attribut .sparse data de pandas 0.9. J'ai également essayé l'instruction if NaN == NaN dans une fonction. J'ai également consulté cet article Comment remplacer les valeurs NA par des zéros dans un cadre de données R ? en regardant d'autres articles. Toutes les méthodes que j'ai essayées n'ont pas fonctionné ou ne reconnaissent pas NaN. Tout conseil ou solution serait apprécié.

2 votes

Le seul problème est que df.fill.na() ne fonctionne pas si le cadre de données sur lequel vous l'appliquez est rééchantillonné ou a été découpé par la fonction loc.

4voto

Alla Abdella Points 18

Remplacer le nan dans différentes colonnes de différentes manières :

   replacement= {'column_A': 0, 'column_B': -999, 'column_C': -99999}
   df.fillna(value=replacement)

4voto

Herker Points 145

Remplacer tous les nan par 0

df = df.fillna(0)

3voto

Ankhnesmerira Points 408

Cela fonctionne pour moi, mais personne ne l'a mentionné. Y aurait-il un problème ?

df.loc[df['column_name'].isnull(), 'column_name'] = 0

2voto

Michael Grogan Points 531

Si vous deviez le convertir en un cadre de données pandas, vous pouvez également le faire en utilisant la méthode suivante fillna .

import numpy as np
df=np.array([[1,2,3, np.nan]])

import pandas as pd
df=pd.DataFrame(df)
df.fillna(0)

Le résultat est le suivant :

     0    1    2   3
0  1.0  2.0  3.0 NaN
>>> df.fillna(0)
     0    1    2    3
0  1.0  2.0  3.0  0.0

2voto

Sumanth Lazarus Points 29

Deux options sont principalement disponibles : en cas d'imputation ou de remplissage des valeurs manquantes. NaN / np.nan avec uniquement des remplacements numériques (à travers la ou les colonnes) :

df['Amount'].fillna(value=None, method= ,axis=1,) est suffisante :

De la documentation :

value : scalaire, dict, Series, ou DataFrame Valeur à utiliser pour remplir les trous (par exemple 0), alternativement un dict/Series/DataFrame de valeurs spécifiant quelle valeur utiliser pour chaque index (pour une série) ou colonne (pour un DataFrame). (les valeurs ne sont pas dans le dict/Series/DataFrame ne seront pas remplies). Cette valeur ne peut pas être une liste.

Ce qui signifie que les "chaînes" ou les "constantes" ne peuvent plus être imputées.

Pour des imputations plus spécialisées, utilisez SimpleImputer() :

from sklearn.impute import SimpleImputer
si = SimpleImputer(strategy='constant', missing_values=np.nan, fill_value='Replacement_Value')
df[['Col-1', 'Col-2']] = si.fit_transform(X=df[['C-1', 'C-2']])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X