Pandas & NumPy Academy · Урок

Фильтры isin() и between()

Выбирайте строки, в которых значение столбца входит в список с помощью isin() или находится в числовом диапазоне с помощью between()

Урок 3 из 413 шагов

«Фильтры isin() и between()» — бесплатный урок Pandas & NumPy Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Pandas & NumPy Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Обзор метода isin()

isin() проверяет, содержится ли каждый элемент Series в заданном списке (или множестве) значений. Метод возвращает булеву Series, которую можно напрямую использовать для фильтрации строк. Это компактнее и часто быстрее, чем объединять несколько сравнений == с помощью |.

Например, вместо (df['country'] == 'USA') | (df['country'] == 'UK') можно написать df['country'].isin(['USA', 'UK']).

import pandas as pd

df = pd.DataFrame({
    'country': ['USA', 'Germany', 'UK', 'France', 'USA'],
    'sales': [400, 200, 150, 300, 600]
})

# Check membership
mask = df['country'].isin(['USA', 'UK'])
print(mask.tolist())  # [True, False, True, False, True]

result = df[mask]
print(result)
#   country  sales
# 0     USA    400
# 2      UK    150
# 4     USA    600

isin() с множествами для ускорения

Вместо списка в isin() можно передать множество Python. Проверка принадлежности множеству выполняется за O(1) — она не замедляется при увеличении списка. Это особенно важно, когда список допустимых значений содержит тысячи элементов: isin() с множеством значительно быстрее, чем isin() со списком.

import pandas as pd

df = pd.DataFrame({
    'sku': ['A001', 'B002', 'A003', 'C004', 'B005'],
    'qty': [10, 5, 3, 8, 12]
})

# Use a set for fast membership check
allowed_skus = {'A001', 'A003', 'B005'}
result = df[df['sku'].isin(allowed_skus)]
print(result)
#     sku  qty
# 0  A001   10
# 2  A003    3
# 4  B005   12

Отрицание isin() с помощью ~

Объедините isin() с оператором ~, чтобы отфильтровать строки, в которых столбец не содержит указанные значения. Это самый понятный способ исключить список конкретных значений — он гораздо нагляднее цепочки сравнений !=.

import pandas as pd

df = pd.DataFrame({
    'status': ['active', 'cancelled', 'shipped', 'refunded', 'active'],
    'amount': [100, 200, 300, 150, 500]
})

bad_statuses = ['cancelled', 'refunded']
# Keep all rows NOT in the excluded list
result = df[~df['status'].isin(bad_statuses)]
print(result)
#     status  amount
# 0   active     100
# 2  shipped     300
# 4   active     500

isin() со столбцом DataFrame в качестве списка

Полезный приём — передать в isin() значения из столбца другого DataFrame. Это эквивалент полусоединения в SQL: сохранить строки df1, ключ которых встречается в df2. В отличие от полного объединения, такой подход не дублирует строки и не добавляет дополнительные столбцы — он только выполняет фильтрацию.

import pandas as pd

orders = pd.DataFrame({
    'order_id': [1, 2, 3, 4, 5],
    'revenue': [100, 200, 300, 400, 500]
})

vip_orders = pd.DataFrame({'order_id': [2, 4]})

# Keep orders whose ID appears in vip_orders
result = orders[orders['order_id'].isin(vip_orders['order_id'])]
print(result)
#    order_id  revenue
# 1         2      200
# 3         4      400

Обзор метода between()

between(left, right) возвращает булеву Series, в которой значение True соответствует элементам, попадающим в замкнутый диапазон [left, right] (по умолчанию границы включаются). Метод заменяет двусторонние условия вроде (df['age'] >= 18) & (df['age'] <= 65) одним понятным вызовом.

Параметр inclusive управляет включением границ: 'both' (по умолчанию), 'left', 'right' или 'neither'.

import pandas as pd

df = pd.DataFrame({
    'age': [15, 22, 35, 67, 45, 8]
})

# Select working-age population
result = df[df['age'].between(18, 65)]
print(result)
#    age
# 1   22
# 2   35
# 4   45

between() с параметром inclusive

По умолчанию обе конечные точки включаются в диапазон. Значение inclusive='left' исключает правую границу (это удобно для полуоткрытых интервалов, например временных корзин), inclusive='right' исключает левую, а inclusive='neither' исключает обе границы, создавая строгий открытый интервал.

import pandas as pd

df = pd.DataFrame({'score': [0, 50, 100, 75, 50]})

# Include only scores strictly between 50 and 100
strict = df[df['score'].between(50, 100, inclusive='neither')]
print(strict)
#    score
# 3     75

# Include 50 but not 100
left_closed = df[df['score'].between(50, 100, inclusive='left')]
print(left_closed)
#    score
# 1     50
# 3     75
# 4     50

between() для столбцов с датами

between() работает и со столбцами datetime. Передайте в качестве границ строки с датами или объекты Timestamp, и Pandas выполнит сравнение базовых значений даты и времени. Это удобный способ выделить временной интервал без преобразования дат в целые числа.

import pandas as pd

df = pd.DataFrame({
    'date': pd.to_datetime(['2024-01-01', '2024-06-15', '2024-11-20', '2025-03-01']),
    'value': [10, 20, 30, 40]
})

# Filter rows in the year 2024
result = df[df['date'].between('2024-01-01', '2024-12-31')]
print(result)
#         date  value
# 0 2024-01-01     10
# 1 2024-06-15     20
# 2 2024-11-20     30

Объединение isin() и between()

Вы можете объединить isin() и between() в одном булевом выражении с помощью & и |. Так создаются компактные и понятные фильтры, для которых иначе потребовалось бы множество вложенных условий. При объединении всегда заключайте каждый вызов в круглые скобки.

import pandas as pd

df = pd.DataFrame({
    'region': ['North', 'South', 'East', 'North', 'West'],
    'revenue': [100, 500, 200, 300, 400]
})

# Rows in North or South regions AND revenue between 200 and 400
result = df[
    df['region'].isin(['North', 'South']) &
    df['revenue'].between(200, 400)
]
print(result)
#    region  revenue
# 3   North      300
# 1   South      500  <- actually excluded (500 > 400)
# 3   North      300

isin() для нескольких столбцов с any

Если нужно проверить, содержит ли любой из нескольких столбцов значение из списка, вызовите isin() для всего DataFrame, а затем используйте .any(axis=1), чтобы объединить результат для каждой строки. Это удобно для одновременного поиска по нескольким столбцам тегов или категорий.

import pandas as pd

df = pd.DataFrame({
    'tag1': ['python', 'java', 'sql'],
    'tag2': ['sql', 'python', 'go'],
    'topic': ['Database', 'Backend', 'Infra']
})

target_langs = ['python', 'sql']
# Check if either tag column matches
mask = df[['tag1', 'tag2']].isin(target_langs).any(axis=1)
result = df[mask]
print(result)
#      tag1    tag2     topic
# 0  python     sql  Database
# 1    java  python   Backend
# 2     sql      go     Infra

Совет по производительности: isin() и несколько ==

Для небольшого списка из 2–3 значений разница между isin() и цепочкой условий == несущественна. Однако для больших списков (сотни значений) isin() работает значительно быстрее, поскольку внутри преобразует список в хеш-множество и выполняет проверки каждого элемента за O(1), а не сравнивает их последовательно.

Для более чистого кода и высокой производительности всегда предпочитайте isin() длинной цепочке условий с |.

import pandas as pd
import numpy as np

# 1 million row DataFrame
df = pd.DataFrame({'id': np.random.randint(0, 10000, size=1_000_000)})

allowed = list(range(0, 500))  # 500 allowed IDs

# isin() is the right approach here — fast hash lookup
result = df[df['id'].isin(allowed)]
print(result.shape)  # around (50000, 1)

Практический фильтр: каталог товаров

Рассмотрим реалистичный пример, в котором isin() используется для фильтрации по категориям, а between() — для фильтрации по диапазону цен. Это распространённый подход в аналитике электронной торговли. Вместе эти два фильтра выбирают именно ту часть товаров, которая нужна для целевой акции.

import pandas as pd

products = pd.DataFrame({
    'name': ['Laptop', 'Mouse', 'Monitor', 'Keyboard', 'Webcam'],
    'category': ['Computing', 'Accessories', 'Displays', 'Accessories', 'Peripherals'],
    'price': [1200, 25, 300, 80, 150]
})

# Products in Accessories or Peripherals, priced 50-200
eligible = products[
    products['category'].isin(['Accessories', 'Peripherals']) &
    products['price'].between(50, 200)
]
print(eligible)
#        name     category  price
# 3  Keyboard  Accessories     80
# 4    Webcam  Peripherals    150

Быстрая проверка

Проверьте, насколько хорошо Вы поняли фильтры isin() и between().

Итоги урока

В этом уроке Вы узнали, что isin() проверяет принадлежность множеству и работает быстрее цепочки нескольких условий ==, ~isin() исключает список значений, а between() фильтрует замкнутый диапазон с необязательным параметром inclusive. Оба метода работают с числовыми, строковыми столбцами и столбцами datetime. Далее мы рассмотрим, как выбирать столбцы DataFrame, соответствующие шаблону имени.

Можно начать бесплатно

Изучай Python с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
30
Уроки
120

Часто задаваемые вопросы

Урок «Фильтры isin() и between()» бесплатный?

Да — полный текст урока «Фильтры isin() и between()» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Pandas & NumPy Academy, подпишись на CoddyKit PRO. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Чему я научусь в уроке «Фильтры isin() и between()»?

Выбирайте строки, в которых значение столбца входит в список с помощью isin() или находится в числовом диапазоне с помощью between() Ты практикуешь Pandas & NumPy Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Pandas & NumPy Academy?

Предыдущий опыт не требуется. Pandas & NumPy Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Фильтры isin() и between()»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Pandas & NumPy Academy?

Да. Каждый урок Pandas & NumPy Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Булева индексация DataFrames
  2. Метод query()
  3. Фильтры isin() и between()
  4. Выбор столбцов по шаблону
← Назад к Pandas & NumPy Academy