Series.where и Series.mask — условная замена значений в pandas

Series.where и Series.mask точечно заменяют значения по булеву условию, не трогая остальные. where оставляет элемент там, где условие True, и подставляет other (по умолчанию NaN) там, где False; mask работает зеркально. Это векторная альтернатива циклам и apply для чистки выбросов, зануления и маскирования данных.

Синтаксис

Series.where(cond, other=nan) · Series.mask(cond, other=nan)

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

Пример 1: where — оставить по True, иначе заменить

df['amount'] = df['amount'].where(df['amount'] >= 0, 0)
df[['order_id', 'amount']].head(3)

Результат:

   order_id  amount
0      1001   120.0
1      1002     0.0
2      1003  1500.0

Пример 2: mask — заменить по True (здесь на NaN)

df['amount'].mask(df['amount'] > 1000).head(3)

Результат:

0     120.0
1     -30.0
2       NaN
Name: amount, dtype: float64

Пример 3: Условие по другой колонке

df['amount'].where(df['channel'] == 'organic', 0).head(3)

Результат:

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

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

where оставляет значения там, где условие True (в отличие от SQL WHERE и np.where — легко перепутать), а mask делает наоборот: df.where(c) эквивалентно df.mask(~c). Если other вводит NaN, целочисленная колонка апкастится во float64. cond, other и сам объект выравниваются по индексу.

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

Полезно для чистки данных: обрезать выбросы, занулить отрицательные значения, скрыть часть данных под NaN без цикла. На собеседовании спрашивают, чтобы проверить понимание, что where сохраняет значения по True, а не фильтрует строки как SQL.

FAQ: частые вопросы про where / mask

Чем where отличается от np.where?

Series.where(cond, other) возвращает объект той же длины: где cond=True — исходное значение, где False — other. np.where(cond, a, b) выбирает из ДВУХ массивов и возвращает ndarray без индекса. Метод pandas сохраняет индекс и по умолчанию подставляет NaN.

Почему после where целочисленная колонка стала float?

Когда other=NaN (значение по умолчанию), pandas должен разместить NaN, а он не помещается в int, поэтому колонка апкастится в float64. Чтобы остаться в целых, задайте конкретный other (например 0) или используйте nullable-тип Int64.

where и mask — как не перепутать?

where оставляет значение там, где условие истинно (keep-where-true), mask — наоборот заменяет там, где условие истинно. Формально df.where(c) равно df.mask(~c). Мнемоника: mask «маскирует» именно то, что попало под условие.

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

Вопросы с собеседований по теме

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

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

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

groupby · merge · pivot_table · apply · value_counts · drop_duplicates

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