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.
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
il n'est pas garanti que le découpage retourne une vue ou une copie. Vous pouvez faire
df['column']=df['column'].fillna(value)
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.
le code ci-dessous a fonctionné pour moi.
import pandas
df = pandas.read_csv('somefile.txt')
df = df.fillna(0)
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)
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)
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
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)