2017-03-18 42 views
5

Pracując z danymi spisu ludności, chcę zamienić NaNs w dwóch kolumnach ("workclass" i "native-country") z odpowiednimi trybami tych dwóch kolumn. Mogę tryby łatwo:Panda Fillna z wielu kolumn z trybem każdej kolumny

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

która zwraca dataframe:

workclass native-country 
0 Private United-States 

jednak

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

robi nie wymienić Nans w każdej kolumnie z niczego, nie mówiąc już o tryb odpowiadający tej kolumnie. Czy jest to płynny sposób?

Odpowiedz

5

Jeśli chcesz przypisać brakujących wartości z mode w niektórych kolumnach dataframe df, można po prostu fillna przez Series stworzonej przez Selekcja według pozycji przez iloc:

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

Lub:

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

Twoje rozwiązanie:

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

Próbka:

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

Można to zrobić tak:

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

Na przykład

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() 

Następnie df jest

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

Następnie wykonując:

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

otrzymujemy że df jest

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