clip() в pandas — обрезка выбросов и winsorize по границам

clip() «прижимает» значения к заданным границам: всё, что ниже lower, становится lower, всё, что выше upper — upper. Аналитику это нужно, чтобы гасить выбросы перед расчётом среднего или обучением модели, не выбрасывая строки. Классический приём — winsorize: обрезать по 5-му и 95-му перцентилям.

Синтаксис

Series.clip(lower=None, upper=None, *, axis=None, inplace=False)

Примеры использования

Пример 1: Winsorize amount по перцентилям

lo, hi = df['amount'].quantile([0.05, 0.95])
df['amount_w'] = df['amount'].clip(lo, hi)
df['amount_w'].agg(['min', 'max'])

Результат:

min     120.0
max    9800.0
Name: amount_w, dtype: float64

Пример 2: Только нижняя граница (не даём отрицательный чек)

df['amount'].clip(lower=0).head(3)

Результат:

0    250.0
1      0.0
2    980.0
Name: amount, dtype: float64
Порешать Python-задачи в тренажёре →

Типичная ошибка

clip не удаляет строки, а заменяет значения на границы, поэтому размер выборки не меняется, а распределение сжимается. NaN остаётся NaN. lower и upper можно передать массивом/Series для поэлементных границ; по умолчанию возвращается копия, для правки на месте нужен inplace=True.

Где спрашивают на собеседовании

Полезно при подготовке признаков и метрик, когда единичные аномалии (случайный чек на миллион) перекашивают среднее, а строку терять нельзя. Часто спрашивают на собеседовании в связке с quantile как реализовать winsorize.

FAQ: частые вопросы про clip

Чем clip отличается от dropna и фильтрации выбросов?

dropna и булева фильтрация удаляют строки, а clip оставляет их и лишь ограничивает значение границей. Это важно, когда нужно сохранить число наблюдений, например при поюзерных агрегатах. clip не меняет число строк вообще.

Как сделать winsorize по перцентилям?

Посчитайте границы через quantile, например df['amount'].quantile([0.05, 0.95]), и передайте их в clip(lo, hi). Всё за пределами перцентилей прижмётся к ним. Это стандартный способ winsorize в pandas без сторонних библиотек.

Что будет с NaN при clip?

Пропуски игнорируются и остаются NaN, границы к ним не применяются. Если нужно и заполнить пропуски, сначала используйте fillna, а затем clip. Порядок операций тут важен.

Задачи в тренажёре по теме

Смежные темы Python

Pandas: основы · NumPy векторизация

Другие функции pandas

groupby · merge · pivot_table · apply · value_counts · drop_duplicates

Открыть Python-тренажёр (556 задач) →