Замените выбросы квантилем столбца в фрейме данных Pandas

у меня есть фрейм данных:

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

вот 5% квантилей:

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

и вот маска для значений, которые ниже квантилей:

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

Я хочу установить значения в df ниже, чем квантиль квантиль для его колонки. Я могу сделать это так:

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

но, конечно, должен быть более элегантный способ. Как я могу сделать это без fillna? Спасибо.

1 ответов


можно использовать DF.mask() метод. Везде, где есть присутствие True экземпляр, значения из другой серии get заменяются выровненными по соответствующим именам столбцов, предоставляя axis=1.

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

enter image description here


другой вариант - использовать DF.where() метод после инвертирования логической маски с помощью Тильды (~ символ).

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

enter image description here