2017-01-20 30 views
6

Mam dataframe:Wymień odstających z kolumną kwantyl w Pandy dataframe

df = pd.DataFrame(np.random.randint(0,100,size=(5, 2)), columns=list('AB')) 
    A B 
0 92 65 
1 61 97 
2 17 39 
3 70 47 
4 56 6 

Oto 5% kwantyle:

down_quantiles = df.quantile(0.05) 
A 24.8 
B 12.6 

A oto maska ​​dla wartości, które są niższe niż kwantyli:

outliers_low = (df < down_quantiles) 
     A  B 
0 False False 
1 False False 
2 True False 
3 False False 
4 False True 

Chcę ustawić wartości w df niższe niż kwantyle na kwantyle kolumny . Mogę to zrobić tak:

df[outliers_low] = np.nan 
df.fillna(down_quantiles, inplace=True) 

    A B 
0 92.0 65.0 
1 61.0 97.0 
2 24.8 39.0 
3 70.0 47.0 
4 56.0 12.6 

Ale na pewno nie powinno być bardziej elegancki sposób. Jak mogę to zrobić bez fillna? Dzięki.

+0

ty myśl jedno-liner: 'df [~ outliers_low] .fillna (down_quantiles, inplace = True)'? – EdChum

+0

Pomyślałem, że powinno być więcej rodzimych pand w tym kierunku. Odpowiedź Nicila Maveli wyraźnie to pokazuje. – shda

+0

Tak, zapomniałem o "masce", awansowałem na odpowiedź Nickila – EdChum

Odpowiedz

8

Można użyć metody DF.mask(). Wszędzie tam, gdzie występuje obecność instancji True, wartości z innych serii get są zamieniane zgodnie z odpowiednimi nazwami kolumn, podając axis=1.

df.mask(outliers_low, down_quantiles, axis=1) 

enter image description here


Innym wariantem byłoby użyć DF.where() metodę po odwracanie swoją logiczną maskę za pomocą tyldy (~) symbol.

df.where(~outliers_low, down_quantiles, axis=1) 

enter image description here