Функция np.where() в pandas: условие без цикла

np.where(условие, значение_если_да, значение_если_нет) — векторный аналог тернарного if для целой колонки: возвращает одно значение там, где условие истинно, и другое — где ложно. Это быстрая замена apply с if внутри и pandas-аналог SQL CASE WHEN для одного условия. Для нескольких веток есть np.select.

Синтаксис

np.where(df['x'] > 0, 'да', 'нет') | np.select([усл1, усл2], [зн1, зн2], default)

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

Пример 1: Флаг крупного заказа одним условием

df['big'] = np.where(df['amount'] >= 1000, 1, 0)

Результат:

   amount  big
0    1200    1
1     500    0

Пример 2: Несколько сегментов через np.select

df['seg'] = np.select(
    [df['total'] >= 10000, df['total'] >= 3000],
    ['VIP', 'средний'], default='новичок')

Результат:

   total      seg
0  12000      VIP
1   4000  средний
2    500  новичок
Порешать Python-задачи в тренажёре →

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

np.where возвращает numpy-массив, а не Series — при присваивании в колонку это ок, но индекс теряется, поэтому не смешивай с операциями, где нужен индекс. np.select проверяет условия по порядку и берёт первое истинное — более узкие условия ставь выше. Не забудь default в np.select, иначе несопавшие строки получат 0 или мусор. Для одного условия — where, для многих — select.

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

np.where/np.select — стандартная замена медленного apply(lambda: if...) на собеседовании по производительности pandas. Просят «перепиши это условие векторно» или «сегментируй без apply». Ценят выбор where для бинарного и select для многоклассового условия.

FAQ: частые вопросы про np.where

Чем np.where лучше apply с if?

np.where считается векторно над всем массивом в C, а apply гоняет питоновскую функцию построчно. На больших данных where в десятки раз быстрее и читается короче.

Как сделать несколько условий вместо вложенных np.where?

np.select([условие1, условие2, ...], [значение1, значение2, ...], default=...) — проверяет условия по порядку и берёт значение первого истинного. Это чище, чем вложенные where.

Это аналог SQL CASE WHEN?

Да: np.where — для одного условия (как простой CASE), np.select — для нескольких веток (как многоусловный CASE WHEN ... THEN ... ELSE).

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

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

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

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

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

groupby · merge · pivot_table · apply · value_counts · drop_duplicates

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