Фильтры isin() и between()
Выбирайте строки, в которых значение столбца входит в список с помощью isin() или находится в числовом диапазоне с помощью between()
«Фильтры 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 600isin() с множествами для ускорения
Вместо списка в 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 500isin() со столбцом 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 45between() с параметром 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 50between() для столбцов с датами
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 300isin() для нескольких столбцов с 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 — локальная установка не требуется.
Все уроки этого курса
- Булева индексация DataFrames
- Метод query()
- Фильтры isin() и between()
- Выбор столбцов по шаблону