Comment puis-je remplacer toutes les valeurs NaN par zéro dans une colonne d'une base de données pandas

j'ai une base 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

quand j'essaie .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 du Module de mathématiques J'ai essayé les pandas .remplacer l'attribut J'ai essayé le .attribut de données clairsemées de pandas 0.9 J'ai aussi essayé si NaN == NaN déclaration d'une fonction. J'ai aussi regardé cet article Comment puis-je remplacer NA valeurs avec zéros dans une dataframe R? en examinant d'autres articles. Toutes les méthodes que j'ai essayées n'ont pas fonctionné ou ne reconnaissent pas NaN. Toute suggestion ou solution serait appréciée.

253
demandé sur Community 2012-11-08 22:50:39

9 réponses

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

Lien vers les Docs pour un dataframe et pour une 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 NaNs dans une seule colonne, sélectionnez la colonne. dans ce cas, j'utilise inplace=True pour changer 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
429
répondu Aman 2016-06-23 17:29:23

il n'est pas garanti que le découpage retourne une vue ou une copie. Vous pouvez faire

df['column']=df['column'].fillna(value)
58
répondu rakesh 2016-10-06 09:10:08

je voulais juste fournir un peu d'une mise à jour/cas spécial car il semble que les gens viennent encore ici. Si vous utilisez un multi-index ou un trancheur d'index, 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 casse la capacité fillna de mettre à jour la base de données originale. J'ai mis "problème" dans les devis parce qu'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, c'est un exemple complexe (bien que j'ai vraiment couru dans elle), mais la même chose peut s'appliquer à moins de niveaux d'index selon la façon dont vous découpez.

la solution est DataFrame.mise à jour:

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

C'est une ligne, lit raisonnablement bien (en quelque sorte) et élimine toute perturbation inutile avec Intermédiaire variables ou boucles tout en vous permettant d'appliquer fillna à n'importe quelle tranche multi-niveaux que vous aimez!

si quelqu'un peut trouver des endroits cela ne fonctionne pas s'il vous plaît postez dans les commentaires, j'ai joué avec elle et en regardant la source et il semble résoudre au moins mes problèmes de tranche Multi-index.

17
répondu Ezekiel Kruglick 2015-12-16 18:29:03

le code ci-dessous a fonctionné pour moi.

import pandas

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

df = df.fillna(0)
15
répondu Cornel Ciobanu 2016-09-13 21:13:37

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)
12
répondu Anton Protopopov 2017-06-15 05:11:20

fillna () est la meilleure façon de le faire. Code -

#fill all Nan value with zero
df = df.fillna(0)

Vous pouvez également utiliser en place si vous ne voulez pas utiliser ' df = df.fillna (valeur) . Code -

df.fillna(0, inplace=True)
9
répondu Nurul Akter Towhid 2017-07-28 19:48:43

vous devez utiliser fillna () . Il fonctionne pour moi.

df = df.fillna(value_to_replace_null)
2
répondu 2017-07-28 19:44:26

le seul problème est df.remplir.na () ne fonctionne pas si la base de données sur laquelle vous l'appliquez est rééchantillonnée ou a été découpée à travers la fonction loc

1
répondu Prince Agarwal 2018-06-11 08:47:32

manière facile de remplir les valeurs manquantes: -

remplissage colonnes de chaîne de caractères: lorsque les colonnes de chaîne de caractères ont des valeurs manquantes et des valeurs NaN.

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

remplissage colonnes 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)

remplissage Nan avec zéro:

df['column name'].fillna(0, inplace = True)
1
répondu tulsi kumar 2018-07-07 19:03:15