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
df['amount'].mask(df['amount'] > 1000).head(3)
Результат:
0 120.0 1 -30.0 2 NaN Name: amount, dtype: float64
df['amount'].where(df['channel'] == 'organic', 0).head(3)
Результат:
0 120.0 1 0.0 2 1500.0 Name: amount, dtype: float64Порешать Python-задачи в тренажёре →
Полезно для чистки данных: обрезать выбросы, занулить отрицательные значения, скрыть часть данных под NaN без цикла. На собеседовании спрашивают, чтобы проверить понимание, что where сохраняет значения по True, а не фильтрует строки как SQL.
Series.where(cond, other) возвращает объект той же длины: где cond=True — исходное значение, где False — other. np.where(cond, a, b) выбирает из ДВУХ массивов и возвращает ndarray без индекса. Метод pandas сохраняет индекс и по умолчанию подставляет NaN.
Когда other=NaN (значение по умолчанию), pandas должен разместить NaN, а он не помещается в int, поэтому колонка апкастится в float64. Чтобы остаться в целых, задайте конкретный other (например 0) или используйте nullable-тип Int64.
where оставляет значение там, где условие истинно (keep-where-true), mask — наоборот заменяет там, где условие истинно. Формально df.where(c) равно df.mask(~c). Мнемоника: mask «маскирует» именно то, что попало под условие.
Pandas: основы · NumPy векторизация
groupby · merge · pivot_table · apply · value_counts · drop_duplicates
Открыть Python-тренажёр (556 задач) →