J'ai les données suivantes ci-dessous. Remarquez que l'âge a Nan. Mon objectif est d'imputer correctement toutes les colonnes.
import pandas as pd import numpy as np #https://www.kaggle.com/shivamp629/traincsv/downloads/traincsv.zip/1 data = pd.read_csv("train.csv") data2 = data[['PassengerId', 'Survived','Pclass','Age','SibSp','Parch','Fare']].copy() from sklearn.preprocessing import Imputer fill_NaN = Imputer(missing_values=np.nan, strategy='mean', axis=1) data2_im = pd.DataFrame(fill_NaN.fit_transform(data2), columns = data2.columns) data2_im
J'ai un code fonctionnel qui impute toutes les colonnes. Les résultats sont ci-dessous. Les résultats semblent problématiques.
+----+-------------+----------+--------+-----------+-------+-------+---------+ | ID | PassengerId | Survived | Pclass | Age | SibSp | Parch | Fare | +----+-------------+----------+--------+-----------+-------+-------+---------+ | 0 | 1.0 | 0.0 | 3.0 | 22.000000 | 1.0 | 0.0 | 7.2500 | | 1 | 2.0 | 1.0 | 1.0 | 38.000000 | 1.0 | 0.0 | 71.2833 | | 2 | 3.0 | 1.0 | 3.0 | 26.000000 | 0.0 | 0.0 | 7.9250 | | 3 | 4.0 | 1.0 | 1.0 | 35.000000 | 1.0 | 0.0 | 53.1000 | | 4 | 5.0 | 0.0 | 3.0 | 35.000000 | 0.0 | 0.0 | 8.0500 | | 5 | 6.0 | 0.0 | 3.0 | 2.909717 | 0.0 | 0.0 | 8.4583 | +----+-------------+----------+--------+-----------+-------+-------+---------+
Mon code est ci-dessous:
+----+-------------+----------+--------+------+-------+-------+---------+ | ID | PassengerId | Survived | Pclass | Age | SibSp | Parch | Fare | +----+-------------+----------+--------+------+-------+-------+---------+ | 0 | 1 | 0 | 3 | 22.0 | 1 | 0 | 7.2500 | | 1 | 2 | 1 | 1 | 38.0 | 1 | 0 | 71.2833 | | 2 | 3 | 1 | 3 | 26.0 | 0 | 0 | 7.9250 | | 3 | 4 | 1 | 1 | 35.0 | 1 | 0 | 53.1000 | | 4 | 5 | 0 | 3 | 35.0 | 0 | 0 | 8.0500 | | 5 | 6 | 0 | 3 | NaN | 0 | 0 | 8.4583 | +----+-------------+----------+--------+------+-------+-------+---------+
C'est bizarre l'âge est 2,909717. Existe-t-il une façon appropriée de procéder à une imputation moyenne simple? Je suis d'accord pour faire colonne par colonne mais je ne suis pas clair avec la syntaxe / l'approche. Merci pour toute aide.
3 Réponses :
Le problème est que vous utilisez le mauvais axe. Le code correct doit être:
fill_NaN = Imputer(missing_values=np.nan, strategy='mean', axis=0)
Notez le axis=0
.
La racine de votre problème est cette ligne:
fill_NaN = Imputer(missing_values=np.nan, strategy='median', axis=0)
, ce qui signifie que vous faites la moyenne sur les lignes (oranges et pommes).
Essayez de la remplacer par:
fill_NaN = Imputer(missing_values=np.nan, strategy='mean', axis=0) # axis=0
et vous aurez le comportement attendu.
strategy = 'median'
pourrait être encore mieux, car il est robuste contre les valeurs aberrantes:
fill_NaN = Imputer(missing_values=np.nan, strategy='mean', axis=1)
merci pour l'aide complète. Vous avez raison, la moyenne arithmétique n'est pas bonne.
Essayez comme
data2.fillna(data2.mean())
ou
fill_NaN = Imputer(missing_values=np.nan, strategy='mean', axis=0)