Как удалить в 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 шт):
Вопрос некорректен - с помощью графика вы не сможете ничего убрать, только визуализировать.
Возможно, вам нужно это:
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")
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")



