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