Series.isin() — фильтрация по списку значений в pandas

isin() проверяет для каждого элемента Series, входит ли он в переданный набор значений, и возвращает булеву маску той же длины. Это pandas-аналог SQL-конструкции WHERE col IN (...). Маску подставляют в индексацию: df[df['channel'].isin(['ads','email'])]. Принимает список, множество, Series или ключи словаря.

Синтаксис

s.isin(values) → Series[bool]

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

Пример 1: Фильтр строк по нескольким каналам

df[df['channel'].isin(['ads', 'referral'])]

Результат:

   order_id   channel  amount
1      1002       ads    1200
3      1004  referral     800

Пример 2: Исключить значения через ~ (NOT IN)

df[~df['user_id'].isin([501, 777])]

Результат:

   order_id  user_id channel
1      1002      502     ads
3      1004      503   email

Пример 3: Сколько строк попадает в список

df['channel'].isin(['ads', 'email']).sum()

Результат:

4
Порешать Python-задачи в тренажёре →

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

isin() сравнивает и по значению, и по типу: int 1 и строка '1' не совпадут, хотя float 1.0 совпадёт с int 1. NaN не входит ни в какой список, кроме случая, когда NaN явно передан в values. Для инверсии используют ~ (не Python not), а маскирующий Series из-за приоритета операторов нужно оборачивать в скобки.

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

Прямой аналог SQL IN — просят, когда нужно отфильтровать по справочнику id или категорий. Идёт в паре с ~ для NOT IN и с .query('x in @list'); на собесе проверяют, что ты не пишешь длинную цепочку == ... | ... == ....

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

Как сделать NOT IN через isin()?

Инвертируй маску тильдой: df[~df['channel'].isin(['ads'])]. Оператор ~ поэлементно отрицает булев Series, в отличие от Python not, который тут не работает. Скобки вокруг isin() обязательны из-за приоритета операций.

isin() по списку или несколько условий через | — что быстрее?

isin() быстрее и читабельнее уже на трёх-четырёх значениях: внутри используется хеш-таблица, а не цепочка сравнений. Добавить значение в список проще, чем дописывать ещё одно == с |. Для двух значений разница незаметна.

Почему isin([1]) не находит строки, где значение — строка '1'?

Потому что isin() сравнивает с учётом типа: число 1 не равно строке '1'. Приведи типы заранее — df['col'].astype(str).isin(['1']) — или передавай значения того же типа, что в колонке. Смешанные типы в колонке — частый источник таких ошибок.

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

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

Pandas: основы

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

groupby · merge · pivot_table · apply · value_counts · drop_duplicates

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