web-dev-qa-db-fra.com

Comment conserver les en-têtes de colonne de la trame de données après le prétraitement dans Scikit-Learn

J'ai un pandas bloc de données qui a quelques lignes et colonnes. Chaque colonne a un en-tête. Maintenant aussi longtemps que je continue à faire des opérations de manipulation de données dans les pandas, mes en-têtes variables sont conservés. Mais si je essayez une fonction de prétraitement des données de Sci-kit-learn lib, je finis par perdre tous mes en-têtes et le cadre est converti en une simple matrice de nombres.

Je comprends pourquoi cela se produit car scikit-learn donne un ndarray numpy en sortie. Et numpy ndarray n'étant qu'une matrice n'aurait pas de nom de colonne.

Mais voici la chose. Si je crée un modèle sur mon ensemble de données, même après le prétraitement initial des données et l'essai d'un modèle, je devrais peut-être effectuer d'autres tâches de manipulation de données pour exécuter un autre modèle pour un meilleur ajustement. Sans pouvoir accéder à l'en-tête de colonne, il est difficile de manipuler les données car je ne sais pas quel est l'index d'une variable particulière, mais il est plus facile de se souvenir du nom de la variable ou même de rechercher en faisant df.columns.

Comment surmonter cela?

EDIT1: Édition avec un exemple d'instantané de données.

    Pclass  Sex Age SibSp   Parch   Fare    Embarked
0   3   0   22  1   0   7.2500  1
1   1   1   38  1   0   71.2833 2
2   3   1   26  0   0   7.9250  1
3   1   1   35  1   0   53.1000 1
4   3   0   35  0   0   8.0500  1
5   3   0   NaN 0   0   8.4583  3
6   1   0   54  0   0   51.8625 1
7   3   0   2   3   1   21.0750 1
8   3   1   27  0   2   11.1333 1
9   2   1   14  1   0   30.0708 2
10  3   1   4   1   1   16.7000 1
11  1   1   58  0   0   26.5500 1
12  3   0   20  0   0   8.0500  1
13  3   0   39  1   5   31.2750 1
14  3   1   14  0   0   7.8542  1
15  2   1   55  0   0   16.0000 1

Ce qui précède est essentiellement le cadre de données pandas. Maintenant, lorsque je fais cela sur ce cadre de données, il enlève les en-têtes de colonne.

from sklearn import preprocessing 
X_imputed=preprocessing.Imputer().fit_transform(X_train) 
X_imputed

Les nouvelles données sont du tableau numpy et donc les noms des colonnes sont supprimés.

array([[  3.        ,   0.        ,  22.        , ...,   0.        ,
          7.25      ,   1.        ],
       [  1.        ,   1.        ,  38.        , ...,   0.        ,
         71.2833    ,   2.        ],
       [  3.        ,   1.        ,  26.        , ...,   0.        ,
          7.925     ,   1.        ],
       ..., 
       [  3.        ,   1.        ,  29.69911765, ...,   2.        ,
         23.45      ,   1.        ],
       [  1.        ,   0.        ,  26.        , ...,   0.        ,
         30.        ,   2.        ],
       [  3.        ,   0.        ,  32.        , ...,   0.        ,
          7.75      ,   3.        ]])

Je souhaite donc conserver les noms des colonnes lorsque je fais des manipulations de données sur mon cadre de données pandas.

31
Baktaawar

scikit-learn supprime en effet les en-têtes de colonne dans la plupart des cas, il suffit donc de les rajouter par la suite. Dans votre exemple, avec X_imputed comme sklearn.preprocessing sortie et X_train en tant que trame de données d'origine, vous pouvez remettre les en-têtes de colonne avec:

X_imputed_df = pd.DataFrame(X_imputed, columns = X_train.columns)
33
selwyth

Selon AMI Tavory réponse ici , selon la documentation, Imputer omet les colonnes ou les lignes vides (quelle que soit la manière dont vous l'exécutez).
Ainsi, avant d'exécuter l'Imputer et de définir les noms de colonne comme décrit ci-dessus , exécutez quelque chose comme ceci (pour les colonnes):

X_train=X_train.dropna(axis=1, how='all')

df.dropna décrit ici.

3
AChervony