2015-11-11 5 views
8

Voglio imputare tutte le colonne su un DataFrame di panda ... l'unico modo che posso pensare di fare ciò è colonna per colonna come mostrato di seguito ...Imputa l'intero DataFrame (tutte le colonne) usando Scikit-learn (sklearn) senza scorrere le colonne

Esiste un'operazione in cui è possibile eseguire l'imputazione dell'intero DataFrame senza iterare attraverso le colonne?

#!/usr/bin/python 
from sklearn.preprocessing import Imputer 
import numpy as np 
import pandas as pd 

#Imputer 
fill_NaN = Imputer(missing_values=np.nan, strategy='mean', axis=1) 

#Model 1 
DF = pd.DataFrame([[0,1,np.nan],[2,np.nan,3],[np.nan,2,5]]) 
DF.columns = "c1.c2.c3".split(".") 
DF.index = "i1.i2.i3".split(".") 

#Impute Series 
imputed_DF = DF 
for col in DF.columns: 
    imputed_column = fill_NaN.fit_transform(DF[col]).T 
    #Fill in Series on DataFrame 
    imputed_DF[col] = imputed_column 

#DF 
#c1 c2 c3 
#i1 0 1 NaN 
#i2 2 NaN 3 
#i3 NaN 2 5 

#imputed_DF 
#c1 c2 c3 
#i1 0 1.0 4 
#i2 2 1.5 3 
#i3 1 2.0 5 

risposta

18

Se si desidera che la cosa mean o median si potrebbe fare come:

fill_NaN = Imputer(missing_values=np.nan, strategy='mean', axis=1) 
imputed_DF = pd.DataFrame(fill_NaN.fit_transform(DF)) 
imputed_DF.columns = DF.columns 
imputed_DF.index = DF.index 

Se si desidera riempire loro con 0 o qualcosa che si potrebbe sempre fare solo:

DF[DF.isnull()] = 0 
+1

Ho trovato tanti cattivi esempi e questo è stato il primo a dare un senso a me. Grazie! –

+1

Grazie! Non ho ricevuto alcun feedback positivo da una delle mie risposte, quindi l'ho davvero apprezzato. –

+1

+1 per includere i passaggi per il ripristino del tipo DataFrame con i nomi e l'indice delle colonne originali, dopo che l'array numpy grezzo è uscito da qualsiasi programma di analisi sklearn –