web-dev-qa-db-fra.com

pandas DataFrame: remplace les valeurs nan par la moyenne des colonnes

J'ai un pandas DataFrame rempli principalement de nombres réels, mais il contient également quelques valeurs nan.

Comment puis-je remplacer les nans 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.

95
piokuc

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().

172
bmu

Essayer:

sub2['income'].fillna((sub2['income'].mean()), inplace=True)
31
Ammar Shigri
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
17
Jeff
# 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])
8
Roshan jha

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()))
7
Pranay Aryal

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.

4
guibor

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')
4
Sunny Barnwal

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_avepour 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

0
pink.slash