2017-03-18 3 views
5

Mit Volkszählungsdaten arbeiten, ich möchte NaNs in zwei Spalten ("Workclass" und "native-Country") mit den jeweiligen Modi dieser beiden Spalten ersetzen. Ich kann die Modi leicht bekommen:Pandas Fillna mehrerer Spalten mit Modus jeder Spalte

mode = df.filter(["workclass", "native-country"]).mode() 

, die einen Datenrahmen zurück:

workclass native-country 
0 Private United-States 

jedoch

df.filter(["workclass", "native-country"]).fillna(mode) 

tut nicht ersetzen die NaNs mit irgendetwas in jeder Spalte, geschweige denn der dieser Spalte entsprechende Modus. Gibt es einen reibungslosen Weg, dies zu tun?

Antwort

5

ist, wenn Sie mit dem mode in einigen Spalten ein Datenrahmen df fehlende Werte zurechnen möchten, können Sie einfach fillna von Series durch Auswahl nach Position erstellt von iloc:

cols = ["workclass", "native-country"] 
df[cols]=df[cols].fillna(df.mode().iloc[0]) 

Oder:

df[cols]=df[cols].fillna(mode.iloc[0]) 

Ihre Lösung:

df[cols]=df.filter(cols).fillna(mode.iloc[0]) 

Probe:

df = pd.DataFrame({'workclass':['Private','Private',np.nan, 'another', np.nan], 
        'native-country':['United-States',np.nan,'Canada',np.nan,'United-States'], 
        'col':[2,3,7,8,9]}) 

print (df) 
    col native-country workclass 
0 2 United-States Private 
1 3   NaN Private 
2 7   Canada  NaN 
3 8   NaN another 
4 9 United-States  NaN 

mode = df.filter(["workclass", "native-country"]).mode() 
print (mode) 
    workclass native-country 
0 Private United-States 

cols = ["workclass", "native-country"] 
df[cols]=df[cols].fillna(df.mode().iloc[0]) 
print (df) 
    col native-country workclass 
0 2 United-States Private 
1 3 United-States Private 
2 7   Canada Private 
3 8 United-States another 
4 9 United-States Private 
2

Sie können es so machen:

df[["workclass", "native-country"]]=df[["workclass", "native-country"]].fillna(value=mode.iloc[0]) 

Zum Beispiel

import pandas as pd 
d={ 
    'key3': [1,4,4,4,5], 
    'key2': [6,6,4], 
    'key1': [6,4,4], 
} 

df=pd.DataFrame.from_dict(d,orient='index').transpose() 

Dann df ist

key3 key2 key1 
0 1 6  6 
1 4 6  4 
2 4 4  4 
3 4 NaN  NaN 
4 5 NaN  NaN 

Dann by doing:

l=df.filter(["key1", "key2"]).mode() 
df[["key1", "key2"]]=df[["key1", "key2"]].fillna(value=l.iloc[0]) 

wir bekommen, dass df

key3 key2 key1 
0 1 6  6 
1 4 6  4 
2 4 4  4 
3 4 6  4 
4 5 6  4 
Verwandte Themen