web-dev-qa-db-fra.com

Comment puis-je remplacer toutes les valeurs NaN par des zéros dans la colonne d'un fichier de données pandas

J'ai un cadre de données 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, l'erreur suivante apparaît.

ValueError: cannot convert float NaN to integer

J'ai essayé d'appliquer une fonction 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é si NaN = = Instruction 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? lorsque je regarde d'autres articles. Toutes les méthodes que j'ai essayées n'ont pas fonctionné ou ne reconnaissent pas NaN. Des astuces ou des solutions seraient appréciées.

372
George Thompson

Je crois que DataFrame.fillna() le fera pour vous.

Lien vers les documents pour n cadre de données et pour ne série .

Exemple:

In [7]: df
Out[7]: 
          0         1
0       NaN       NaN
1 -0.494375  0.570994
2       NaN       NaN
3  1.876360 -0.229738
4       NaN       NaN

In [8]: df.fillna(0)
Out[8]: 
          0         1
0  0.000000  0.000000
1 -0.494375  0.570994
2  0.000000  0.000000
3  1.876360 -0.229738
4  0.000000  0.000000

Pour remplir les NaN dans une seule colonne, sélectionnez uniquement cette colonne. dans ce cas, j'utilise inplace = True pour modifier le contenu de df.

In [12]: df[1].fillna(0, inplace=True)
Out[12]: 
0    0.000000
1    0.570994
2    0.000000
3   -0.229738
4    0.000000
Name: 1

In [13]: df
Out[13]: 
          0         1
0       NaN  0.000000
1 -0.494375  0.570994
2       NaN  0.000000
3  1.876360 -0.229738
4       NaN  0.000000
625
Aman

Il n'est pas garanti que le découpage retourne une vue ou une copie. Tu peux faire

df['column'] = df['column'].fillna(value)
95
rakesh

Vous pouvez utiliser replace pour changer NaN en 0:

import pandas as pd
import numpy as np

# for column
df['column'] = df['column'].replace(np.nan, 0)

# for whole dataframe
df = df.replace(np.nan, 0)

# inplace
df.replace(np.nan, 0, inplace=True)
23
Anton Protopopov

Je voulais juste fournir un peu de mise à jour/cas spécial car il semble que les gens viennent toujours ici. Si vous utilisez un index multiple ou utilisez un indexeur, l'option inplace = True peut ne pas être suffisante pour mettre à jour la tranche que vous avez choisie. Par exemple, dans un multi-index de niveau 2x2, cela ne changera aucune valeur (à partir de pandas 0.15):

idx = pd.IndexSlice
df.loc[idx[:,mask_1],idx[mask_2,:]].fillna(value=0,inplace=True)

Le "problème" est que le chaînage empêche la capacité de fillna de mettre à jour le cadre de données d'origine. Je mets "problème" entre guillemets car il y a de bonnes raisons pour les décisions de conception qui ont conduit à ne pas interpréter par ces chaînes dans certaines situations. En outre, il s'agit d'un exemple complexe (même si je l'ai vraiment rencontré), mais la même chose peut s'appliquer à moins de niveaux d'index, en fonction de la manière dont vous segmentez.

La solution est DataFrame.update:

df.update(df.loc[idx[:,mask_1],idx[[mask_2],:]].fillna(value=0))

C'est une ligne, lit assez bien (en quelque sorte) et élimine toute interférence inutile avec des variables intermédiaires ou des boucles tout en vous permettant d'appliquer fillna à n'importe quelle tranche à plusieurs niveaux que vous aimez!

Si quelqu'un peut trouver des endroits qui ne fonctionnent pas, merci de les publier dans les commentaires, je les ai bousillés et j'ai regardé la source et cela semble résoudre au moins mes problèmes de tranches à plusieurs index.

21
Ezekiel Kruglick

Le code ci-dessous a fonctionné pour moi.

import pandas

df = pandas.read_csv('somefile.txt')

df = df.fillna(0)
20
Cornel Ciobanu

n moyen facile de remplir les valeurs manquantes: -

remplissagecolonnes de chaîne: lorsque les colonnes de chaîne ont des valeurs manquantes et des valeurs NaN.

df['string column name'].fillna(df['string column name'].mode().values[0], inplace = True)

remplissagecolonnes numériques: lorsque les colonnes numériques ont des valeurs manquantes et des valeurs NaN.

df['numeric column name'].fillna(df['numeric column name'].mean(), inplace = True)

remplir NaN avec zéro:

df['column name'].fillna(0, inplace = True)
4
tulsi kumar

enter image description here

Considérant que la colonne particulière Amount dans le tableau ci-dessus est de type entier. Ce qui suit serait une solution:

df['Amount'] = df.Amount.fillna(0).astype(int)

De même, vous pouvez le remplir avec différents types de données comme float, str et ainsi de suite.

En particulier, je considérerais que type de données compare différentes valeurs de la même colonne.

1
Bharath_Raja

Remplacer les valeurs na chez les pandas

df['column_name'].fillna(value_to_be_replaced,inplace=True)

si inplace = False, au lieu de mettre à jour le df (dataframe), il retournera les valeurs modifiées.

1
Vivek Ananthan

Si vous deviez le convertir en un fichier de données pandas, vous pouvez également le faire en utilisant fillna.

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

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

Cela retournera ce qui suit:

     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
1
Michael Grogan

Il y a deux options disponibles principalement; en cas d'imputation ou de remplissage des valeurs manquantes NaN/np.nan avec uniquement des remplacements numériques (dans toutes les colonnes):

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

De la documentation:

valeur: scalar, dict, Series ou DataFrame Valeur à utiliser pour combler les trous (par exemple 0), alternativement dict/Series/DataFrame de valeurs spécifiant la valeur à utiliser pour chaque index (pour une série) ou colonne (pour un DataFrame) . (les valeurs ne figurant pas dans dict/Series/DataFrame ne seront pas renseignées). Cette valeur ne peut pas être une liste.

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

Pour les 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']])

0
Sumanth Lazarus

Vous pouvez également utiliser des dictionnaires pour remplir les valeurs NaN des colonnes spécifiques du DataFrame plutôt que pour remplir tous les DF avec une valeur unique.

import pandas as pd

df = pd.read_Excel('example.xlsx')
df.fillna( {
        'column1': 'Write your values here',
        'column2': 'Write your values here',
        'column3': 'Write your values here',
        'column4': 'Write your values here',
        .
        .
        .
        'column-n': 'Write your values here'} , inplace=True)
0
Farrukh Faizy