J'ai un pandas DataFrame rempli principalement de nombres réels, mais il contient également quelques valeurs nan
.
Comment puis-je remplacer les nan
s par des moyennes de colonnes où elles se trouvent?
Cette question est très similaire à celle-ci: tableau numpy: remplace les valeurs nan par la moyenne des colonnes mais, malheureusement, la solution proposée ne fonctionne pas pour un pandas DataFrame.
Vous pouvez simplement utiliser DataFrame.fillna
pour renseigner directement les nan
:
In [27]: df
Out[27]:
A B C
0 -0.166919 0.979728 -0.632955
1 -0.297953 -0.912674 -1.365463
2 -0.120211 -0.540679 -0.680481
3 NaN -2.027325 1.533582
4 NaN NaN 0.461821
5 -0.788073 NaN NaN
6 -0.916080 -0.612343 NaN
7 -0.887858 1.033826 NaN
8 1.948430 1.025011 -2.982224
9 0.019698 -0.795876 -0.046431
In [28]: df.mean()
Out[28]:
A -0.151121
B -0.231291
C -0.530307
dtype: float64
In [29]: df.fillna(df.mean())
Out[29]:
A B C
0 -0.166919 0.979728 -0.632955
1 -0.297953 -0.912674 -1.365463
2 -0.120211 -0.540679 -0.680481
3 -0.151121 -2.027325 1.533582
4 -0.151121 -0.231291 0.461821
5 -0.788073 -0.231291 -0.530307
6 -0.916080 -0.612343 -0.530307
7 -0.887858 1.033826 -0.530307
8 1.948430 1.025011 -2.982224
9 0.019698 -0.795876 -0.046431
Le docstring de fillna
indique que value
devrait être un scalaire ou un dict, cependant, il semble fonctionner avec un Series
Si vous voulez passer un dict, vous pouvez utiliser df.mean().to_dict()
.
Essayer:
sub2['income'].fillna((sub2['income'].mean()), inplace=True)
In [16]: df = DataFrame(np.random.randn(10,3))
In [17]: df.iloc[3:5,0] = np.nan
In [18]: df.iloc[4:6,1] = np.nan
In [19]: df.iloc[5:8,2] = np.nan
In [20]: df
Out[20]:
0 1 2
0 1.148272 0.227366 -2.368136
1 -0.820823 1.071471 -0.784713
2 0.157913 0.602857 0.665034
3 NaN -0.985188 -0.324136
4 NaN NaN 0.238512
5 0.769657 NaN NaN
6 0.141951 0.326064 NaN
7 -1.694475 -0.523440 NaN
8 0.352556 -0.551487 -1.639298
9 -2.067324 -0.492617 -1.675794
In [22]: df.mean()
Out[22]:
0 -0.251534
1 -0.040622
2 -0.841219
dtype: float64
Appliquer par colonne la moyenne de ces colonnes et remplir
In [23]: df.apply(lambda x: x.fillna(x.mean()),axis=0)
Out[23]:
0 1 2
0 1.148272 0.227366 -2.368136
1 -0.820823 1.071471 -0.784713
2 0.157913 0.602857 0.665034
3 -0.251534 -0.985188 -0.324136
4 -0.251534 -0.040622 0.238512
5 0.769657 -0.040622 -0.841219
6 0.141951 0.326064 -0.841219
7 -1.694475 -0.523440 -0.841219
8 0.352556 -0.551487 -1.639298
9 -2.067324 -0.492617 -1.675794
# To read data from csv file
Dataset = pd.read_csv('Data.csv')
# To divide input in X and y axis
X = Dataset.iloc[:, :-1].values
Y = Dataset.iloc[:, 3].values
# To calculate mean use imputer class
from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values='NaN', strategy='mean', axis=0)
imputer = imputer.fit(X[:, 1:3])
X[:, 1:3] = imputer.transform(X[:, 1:3])
Si vous voulez imputer les valeurs manquantes avec la moyenne et que vous voulez aller colonne par colonne, alors cette imputation ne sera effectuée qu'avec la moyenne de cette colonne. Cela pourrait être un peu plus lisible.
sub2['income'] = sub2['income'].fillna((sub2['income'].mean()))
Une autre option en plus de celles ci-dessus est:
df = df.groupby(df.columns, axis = 1).transform(lambda x: x.fillna(x.mean()))
Il est moins élégant que les réponses précédentes pour la moyenne, mais il pourrait être plus court si vous souhaitez remplacer les valeurs null par une autre fonction de colonne.
Utilisez directement df.fillna(df.mean())
pour remplir toute la valeur nulle avec la moyenne
Si vous voulez remplir la valeur null avec la moyenne de cette colonne, vous pouvez utiliser cette
supposez x=df['Item_Weight']
ici Item_Weight
est le nom de la colonne
nous assignons ici (remplissez les valeurs nulles de x avec la moyenne de x dans x)
df['Item_Weight'] = df['Item_Weight'].fillna((df['Item_Weight'].mean()))
Si vous voulez remplir une valeur nulle avec une chaîne, utilisez
ici Outlet_size
est le nom de la colonne
df.Outlet_Size = df.Outlet_Size.fillna('Missing')
Pandas: Comment remplacer les valeurs de NaN par les statistiques moyenne (moyenne), médiane ou autre d'une colonne?
Supposons que votre DataFrame est df
et que vous avez une colonne appelée nr_items
. C'est: df['nr_items']
Si vous voulez remplacer les valeurs NaN
de votre colonne df['nr_items']
par la moyenne de la colonne:
Utilisez la méthode .fillna
:
mean_value=df['nr_items].mean()
df['nr_item_ave']=df['nr_items].fillna(mean_value)
J'ai créé une nouvelle colonne df
appelée nr_item_ave
pour stocker la nouvelle colonne avec les valeurs NaN
remplacées par la valeur mean
de la colonne.
Vous devez faire attention lorsque vous utilisez la variable mean
. Si vous avez outliers, il est plus recommandé d'utiliser le median