Filtry isin() i between()
Wybierać wiersze, w których wartość kolumny znajduje się na liście za pomocą isin() lub mieści się w zakresie liczbowym za pomocą between()
Filtry isin() i between() to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Pandas & NumPy Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.
Przegląd metody isin()
isin() sprawdza, czy każdy element obiektu Series znajduje się na podanej liście (lub w podanym zbiorze) wartości. Zwraca obiekt Series wartości logicznych, którego można bezpośrednio użyć do filtrowania wierszy. Jest to zwięźlejsze i często szybsze niż łączenie wielu porównań == za pomocą |.
Na przykład zamiast (df['country'] == 'USA') | (df['country'] == 'UK') można napisać 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() ze zbiorami dla większej szybkości
Zamiast listy można przekazać do isin() zbiór Pythona. Wyszukiwanie przynależności w zbiorze ma złożoność O(1) — nie staje się wolniejsze wraz ze wzrostem listy. Ma to znaczenie, gdy lista dozwolonych wartości zawiera tysiące elementów, ponieważ isin() oparte na zbiorze jest znacznie szybsze niż isin() oparte na liście.
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 12Negowanie isin() za pomocą ~
Połączenie isin() z operatorem ~ pozwala filtrować wiersze, w których kolumna nie zawiera określonych wartości. Jest to najczytelniejszy sposób na wykluczenie listy konkretnych wartości, znacznie bardziej przejrzysty niż tworzenie łańcucha porównań !=.
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() z kolumną DataFrame jako listą
Przydatnym rozwiązaniem jest przekazanie do isin() wartości z kolumny innego obiektu DataFrame. Odpowiada to półzłączeniu SQL: zachowuje wiersze w df1, których klucz występuje w df2. W przeciwieństwie do pełnego scalania nie duplikuje wierszy ani nie dodaje dodatkowych kolumn — po prostu filtruje dane.
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 400Przegląd metody between()
between(left, right) zwraca obiekt Series wartości logicznych, w którym True oznacza, że wartości mieszczą się w domkniętym zakresie [left, right] (domyślnie łącznie z granicami). Zastępuje dwustronne warunki, takie jak (df['age'] >= 18) & (df['age'] <= 65), pojedynczym, czytelnym wywołaniem.
Parametr inclusive określa uwzględnianie granic: 'both' (domyślnie), 'left', 'right' lub '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() z parametrem inclusive
Domyślnie oba końce zakresu są uwzględniane. Ustawienie inclusive='left' wyklucza prawą granicę (co jest przydatne w przypadku przedziałów lewostronnie domkniętych, takich jak przedziały czasowe), inclusive='right' wyklucza lewą granicę, a inclusive='neither' wyklucza oba końce, tworząc ścisły przedział otwarty.
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() dla kolumn z datami
between() działa również na kolumnach typu datetime. Jako granice można przekazać ciągi dat lub obiekty Timestamp, a Pandas wykona porównanie na podstawie wewnętrznych wartości daty i czasu. To prosty sposób na wyodrębnienie przedziału czasowego bez konwertowania dat na liczby całkowite.
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Łączenie isin() i between()
Można łączyć isin() i between() w tym samym wyrażeniu logicznym za pomocą & i |. Tworzy to zwięzłe, czytelne filtry, które w przeciwnym razie wymagałyby wielu zagnieżdżonych warunków. Przy łączeniu wywołań należy zawsze ujmować każde z nich w nawiasy.
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() dla wielu kolumn z użyciem any
Jeśli chcą Państwo sprawdzić, czy dowolna z kilku kolumn zawiera wartość z listy, można wywołać isin() dla całego obiektu DataFrame i użyć .any(axis=1), aby zredukować wynik wierszami. Jest to przydatne podczas jednoczesnego wyszukiwania w wielu kolumnach tagów lub kategorii.
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 InfraWskazówka dotycząca wydajności: isin() a wiele ==
W przypadku małej listy zawierającej 2–3 wartości różnica między isin() a połączonymi warunkami == jest znikoma. Jednak dla dużych list (zawierających setki wartości) isin() jest znacznie szybsze, ponieważ wewnętrznie konwertuje listę na zbiór mieszający i wykonuje wyszukiwania o złożoności O(1) dla każdego elementu, zamiast porównywać wartości sekwencyjnie.
W celu uzyskania czytelniejszego kodu i lepszej wydajności należy zawsze preferować isin() zamiast długiego łańcucha warunków |.
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)Filtr z praktycznego zastosowania: katalog produktów
Oto realistyczny przykład łączący isin() do filtrowania według kategorii oraz between() do filtrowania według zakresu cen — jest to częsty wzorzec w analizie danych e-commerce. Oba filtry razem wybierają dokładnie ten podzbiór produktów, który jest potrzebny do ukierunkowanej promocji.
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 150Szybki test
Sprawdź swoją wiedzę na temat filtrów isin() i between().
Podsumowanie lekcji
W tej lekcji poznali Państwo następujące zagadnienia: isin() sprawdza przynależność do zbioru i jest szybsze niż łączenie wielu warunków ==; ~isin() wyklucza listę wartości; a between() filtruje domknięty zakres za pomocą opcjonalnego parametru inclusive. Obie metody działają na kolumnach liczbowych, tekstowych i typu datetime. Następnie omówimy wybieranie kolumn DataFrame pasujących do wzorca nazwy.
Często zadawane pytania
Czy lekcja „Filtry isin() i between()” jest bezpłatna?
Tak — pełny tekst „Filtry isin() i between()” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Pandas & NumPy Academy, przejdź na CoddyKit PRO. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Filtry isin() i between()”?
Wybierać wiersze, w których wartość kolumny znajduje się na liście za pomocą isin() lub mieści się w zakresie liczbowym za pomocą between() Ćwiczysz Pandas & NumPy Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Pandas & NumPy Academy?
Nie wymagamy żadnego doświadczenia. Pandas & NumPy Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Filtry isin() i between()”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Pandas & NumPy Academy?
Tak. Każda lekcja Pandas & NumPy Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Indeksowanie boolowskie obiektów DataFrame
- Metoda query()
- Filtry isin() i between()
- Wybieranie kolumn według wzorca