2015-04-12 12 views
14

Ho un frame dati panda che ha alcune righe e colonne. Ogni colonna ha un'intestazione. Ora finché continuo a fare operazioni di manipolazione dei dati nei panda, le mie intestazioni variabili vengono mantenute. Ma se provo qualche funzione di pre-elaborazione dei dati di Sci-kit-learn lib, finisco per perdere tutte le mie intestazioni e il frame viene convertito in una matrice di numeri.Come mantenere le intestazioni delle colonne del frame di dati dopo Pre-processing in scikit-learn

Capisco perché succede perché scikit-learn fornisce un ndarray insipido come output. E ndarray insensato essendo solo matrice non avrebbe nomi di colonne.

Ma ecco la cosa. Se sto costruendo un modello sul mio set di dati, anche dopo la pre-elaborazione dei dati iniziali e la prova di alcuni modelli, potrei dover eseguire altre attività di manipolazione dei dati per eseguire altri modelli per una migliore corrispondenza. Senza essere in grado di accedere all'intestazione della colonna è difficile eseguire la manipolazione dei dati in quanto potrebbe non sapere qual è l'indice di una particolare variabile, ma è più facile ricordare il nome della variabile o persino cercare df.columns.

Come superare questo?

EDIT1: modifica con snapshot dei dati di esempio.

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 

Quanto sopra è fondamentalmente il frame di dati panda. Ora quando lo faccio su questo frame di dati si spogliano le intestazioni delle colonne.

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

I nuovi dati sono di tipo numpy e quindi i nomi delle colonne vengono eliminati.

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

così voglio conservare i nomi delle colonne quando faccio un po 'di manipolazione dei dati sul mio telaio dati panda.

+0

Un esempio del codice Panda potrebbe essere più utile. Non Pandas fornisce un modo per estrarre i dati da una cornice e quindi sostituirli con una nuova copia? – hpaulj

+2

@Manish: si prega di fornire un esempio molto semplice e riproducibile! Un dataframe a tre righe renderebbe la tua domanda più comprensibile. (Forse copiare semplicemente 'saved_cols = df.columns' e poi riassegnarlo al' df' modificato farebbe il trucco, ma non sono sicuro che sia ciò di cui hai bisogno) – cd98

+2

Infatti, come dice @ cd98, copia di 'saved_cols = df .columns' e poi quando hai ottenuto la serie, facendo 'pandas.DataFrame (series, saved_cols)' ottieni il tuo dataframe. Lo faccio per esempio quando uso 'train_test_split', che restituisce un' numpy ndarray', ma ho bisogno di usarlo come un dataframe. Non è qualcosa di cui essere particolarmente orgoglioso, ma secondo me è abbastanza buono. – lrnzcig

risposta

12

scikit-learn infatti rimuove le intestazioni delle colonne nella maggior parte dei casi, quindi è sufficiente aggiungerle di nuovo in seguito. Nel tuo esempio, con X_imputed come sklearn.preprocessing uscita e X_train come dataframe originale, è possibile mettere le intestazioni delle colonne di nuovo avanti con:

X_imputed_df = pd.DataFrame(X_imputed, columns = X_train.columns) 
+0

Grazie mille per questa risposta ... Sono rimasto bloccato sullo stesso problema e la tua risposta ha risolto il mio problema. – gaurus

+11

Cosa fare se la mia fase di pre-elaborazione è la vendita di feature? Dire, ho 1000 colonne e dopo il pre-elaborazione (sklearn.feature_selection.SelectPercentile) Restituisce solo 100 colonne. Come faccio a sapere quali sono le colonne che vengono rimosse e che non vengono rimosse –

+0

@SupreethMeka lo hai mai capito? –

1

Secondo Ami Tavory's risposta here, per la documentazione, Imputer omette le colonne vuote o righe (comunque lo esegui).
Così, prima di eseguire l'Imputer e impostando i nomi delle colonne come descritto above, eseguire qualcosa di simile (per le colonne):

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

df.dropna described here.

Problemi correlati