У меня есть фрейм данных панд с несколькими столбцами.
Теперь я знаю, что определенные строки являются выбросами на основе определенного значения столбца.
Например
столбец 'Vol' имеет все значения вокруг,
12xx
и одно значение4000
(выброс).
Теперь я хотел бы исключить те строки, которые имеют Vol
такой столбец.
Итак, по сути, мне нужно поместить фильтр на фрейм данных так, чтобы мы выбирали все строки, где значения определенного столбца находятся в пределах, скажем, 3 стандартных отклонения от среднего значения.
Какой элегантный способ добиться этого?
Используйте
boolean
индексирование, как вы бы сделали вnumpy.array
Для серии это похоже:
источник
DataFrame.abs()
вашему сведениюDataFrame.clip()
clip()
Джеффа контуры не удаляются:df.SOME_DATA.clip(-3std,+3std)
назначьте контуры либо на + 3std, либо на -3stddf_new = df[np.abs(df - df.mean()) <= (3 * df.std())]
. Но в отличие от применения его к Серии или одному столбцу, это заменит выбросыnp.nan
и сохранит форму DataFrame, поэтому для заполнения отсутствующих значений может потребоваться интерполяция.Для каждого столбца данных можно получить квантиль с помощью:
а затем отфильтруйте с помощью:
Если нужно удалить нижний и верхний выбросы, объедините условие с оператором AND:
источник
Этот ответ аналогичен ответу @tanemaki, но использует
lambda
выражение вместоscipy stats
.Чтобы отфильтровать DataFrame, где только один столбец (например, «B») находится в пределах трех стандартных отклонений:
Смотрите здесь о том, как применять этот z-показатель на скользящей основе: скользящий Z-показатель применяется к кадру данных pandas.
источник
источник
Поскольку я не видел ответа, касающегося числовых и нечисловых атрибутов, здесь приводится ответ в виде дополнения.
Возможно, вы захотите сбросить выбросы только на числовые атрибуты (категориальные переменные вряд ли могут быть выбросами).
Определение функции
Я расширил предложение @ tanemaki для обработки данных, когда присутствуют также нечисловые атрибуты:
использование
пример
Вообразите набор данных
df
с некоторыми значениями о домах: переулок, контур земли, цена продажи, например: документация данныхВо-первых, вы хотите визуализировать данные на графике рассеяния (с z-счетом Thresh = 3):
источник
reduce=False
сpandas
версии 0.23.0,result_type='reduce'
дляreduce=False
.Для каждой серии в кадре данных вы можете использовать
between
иquantile
для удаления выбросов.источник
scipy.stats
имеет методыtrim1()
иtrimboth()
вырезать выбросы в одну строку, в соответствии с ранжированием и введенным процентом удаленных значений.источник
trimboth
было проще для меня.Другой вариант - преобразовать ваши данные, чтобы уменьшить влияние выбросов. Вы можете сделать это, украсив ваши данные.
источник
Если вам нравится цепочка методов, вы можете получить логическое условие для всех числовых столбцов, например:
Каждое значение каждого столбца будет преобразовано в
True/False
зависимости от того, отклонены ли его значения от трех стандартных отклонений от среднего или нет.источник
le(3)
с момента его удаления выбросов. Таким образом, вы получаетеTrue
за выбросы. Кроме того +1 и этот ответ должен быть вышеВы можете использовать логическую маску:
вывод:
источник
Поскольку я нахожусь на очень ранней стадии моего пути в науке о данных, я лечу выбросы с помощью приведенного ниже кода.
источник
Получите 98-й и 2-й процентили как пределы наших выбросов
источник
Ниже приведен полный пример с данными и двумя группами:
Импорт:
Пример данных с 2 группами: G1: группа 1. G2: группа 2:
Прочитайте текстовые данные в pandas dataframe:
Определите выбросы, используя стандартные отклонения
Определите значения отфильтрованных данных и выбросы:
Распечатать результат:
источник
Моя функция для удаления выбросов
источник
Я предпочитаю обрезать, а не уронить. следующее будет закреплено на 2-м и 98-м пестиле.
источник
Удаление и удаление выбросов, которые я считаю статистически неправильными. Это отличает данные от исходных данных. Также делает данные неравномерной формы и, следовательно, лучший способ состоит в том, чтобы уменьшить или избежать влияния выбросов путем логического преобразования данных. Это сработало для меня:
источник