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
df['amount'].clip(lower=0).head(3)
Результат:
0 250.0 1 0.0 2 980.0 Name: amount, dtype: float64Порешать Python-задачи в тренажёре →
Полезно при подготовке признаков и метрик, когда единичные аномалии (случайный чек на миллион) перекашивают среднее, а строку терять нельзя. Часто спрашивают на собеседовании в связке с quantile как реализовать winsorize.
dropna и булева фильтрация удаляют строки, а clip оставляет их и лишь ограничивает значение границей. Это важно, когда нужно сохранить число наблюдений, например при поюзерных агрегатах. clip не меняет число строк вообще.
Посчитайте границы через quantile, например df['amount'].quantile([0.05, 0.95]), и передайте их в clip(lo, hi). Всё за пределами перцентилей прижмётся к ним. Это стандартный способ winsorize в pandas без сторонних библиотек.
Пропуски игнорируются и остаются NaN, границы к ним не применяются. Если нужно и заполнить пропуски, сначала используйте fillna, а затем clip. Порядок операций тут важен.
Pandas: основы · NumPy векторизация
groupby · merge · pivot_table · apply · value_counts · drop_duplicates
Открыть Python-тренажёр (556 задач) →