Замените выбросы квантилем столбца в фрейме данных 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)
другой вариант - использовать DF.where()
метод после инвертирования логической маски с помощью Тильды (~
символ).
df.where(~outliers_low, down_quantiles, axis=1)