2016-12-19 1 views
0

Ich versuche, eine einfache Funktion zu bauen, um die Pandas Spalten mit einige Verteilung zu füllen, aber es funktioniert nicht die gesamte Tabelle zu füllen (df noch NaN nach fillna haben ...)Pandas fillna() funktioniert nicht richtig

def simple_impute_missing(df): 
    from numpy.random import normal 
    rnd_filled = pd.DataFrame({c : normal(df[c].mean(), df[c].std(), len(df)) 
            for c in df.columns[3:]}) 

    filled_df = df.fillna(rnd_filled)  
    return filled_df 

Aber die zurückgegebenen df, haben immer noch NaNs!

Ich habe überprüft, um sicherzustellen, dass rnd_filled voll ist und die richtige Form haben. was ist los?

+0

Are NaN in der ersten, zweiten und dritten Spalte nur? – jezrael

+1

wenn ersetzen NaN in allen df, entfernen '[: 3]' aus 'df.columns [3:]' – jezrael

+1

ein anderes mögliches Problem ist, wenn alle Daten in einer Spalte 'NaN' sind. Können Sie Datenmuster hinzufügen? – jezrael

Antwort

1

Ich denke, Sie müssen entfernen [:3] von df.columns[3:] für alle Spalten von df auswählen.

Probe:

df = pd.DataFrame({'A':[1,np.nan,3], 
        'B':[4,5,6], 
        'C':[np.nan,8,9], 
        'D':[1,3,np.nan], 
        'E':[5,np.nan,6], 
        'F':[7,np.nan,3]}) 

print (df) 
    A B C D E F 
0 1.0 4 NaN 1.0 5.0 7.0 
1 NaN 5 8.0 3.0 NaN NaN 
2 3.0 6 9.0 NaN 6.0 3.0 

rnd_filled = pd.DataFrame({c : normal(df[c].mean(), df[c].std(), len(df)) 
            for c in df.columns}) 

filled_df = df.fillna(rnd_filled)  
print (filled_df) 
      A B   C   D   E   F 
0 1.000000 4 6.922458 1.000000 5.000000 7.000000 
1 2.277218 5 8.000000 3.000000 5.714767 6.245759 
2 3.000000 6 9.000000 0.119522 6.000000 3.000000