Как удалить в dataframe выбросы с помощью boxplot?

Есть данные с выбросами.

введите сюда описание изображения

Искала вариант удаления выбросов с помощью boxplot, но не нашла способ применить такой вариант:

Q1 =  df['y'].quantile(0.25)
Q3 = df['y'].quantile(0.75)
IQR = Q3 - Q1
df[(df['y'] < Q1-1.5*IQR ) | (df['y'] > Q1+1.5*IQR)]['y']

Это маска? Как с ее помощью изменить основной датасет, чтобы он был без выбросов по полю y, значения которого как выбросы надо удалить: меньше Q1-1,5 * IQR и выше Q3 + 1,5 * IQR?


Ответы (2 шт):

Автор решения: strawdog

Вопрос некорректен - с помощью графика вы не сможете ничего убрать, только визуализировать.

Возможно, вам нужно это:

df_IQR = df[(df['y'] > Q1) & (df['y'] < Q3)]
df_IQR.boxplot(column="y")

введите сюда описание изображения

Update:

Если применять исправленную формулу, а не обрезать прямо по квартилям, то получится так:

df_IQR = df[(df['y'] > (Q1-1.5*IQR)) & (df['y'] < (Q3+1.5*IQR))]
df_IQR.boxplot(column="y")

введите сюда описание изображения

→ Ссылка
Автор решения: MaxU

NOTE: в приведенной вами ссылке ошибка в формуле:

(df['col_name'] < Q1-1.5*IQR ) | (df['col_name'] > Q1+1.5*IQR)
# NOTE: ------------------------------------------> ^

правильная формула:

(df['col_name'] < Q1-1.5*IQR ) | (df['col_name'] > Q3+1.5*IQR)
# NOTE: ------------------------------------------> ^

Картинка объясняющая формулу:

введите сюда описание изображения


Решение:

Можно воспользоваться методом DataFrame.query() - мне кажется условия запроса так легче читаются и воспринимаются:

df.query("@Q1 - 1.5*@IQR < y < @Q3 + 1.5*@IQR").boxplot(column="y")
→ Ссылка