Filtri isin() e between()
Selezioni le righe in cui il valore di una colonna appartiene a una lista con isin() oppure rientra in un intervallo numerico con between().
Filtri isin() e between() è una lezione Pandas & NumPy Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Pandas & NumPy Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Pandas & NumPy Academy include 4 lezioni in totale.
Panoramica del metodo isin()
isin() verifica se ogni elemento di una Series è contenuto in un determinato elenco (o insieme) di valori. Restituisce una Series booleana che può essere usata direttamente per filtrare le righe. È una soluzione più concisa e spesso più veloce rispetto alla concatenazione di più confronti == con |.
Per esempio, invece di (df['country'] == 'USA') | (df['country'] == 'UK'), si scrive 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() con gli insiemi per una maggiore velocità
È possibile passare a isin() un insieme Python invece di una lista. La ricerca dell'appartenenza in un insieme ha complessità O(1): non diventa più lenta all'aumentare delle dimensioni della lista. Questo è importante quando l'elenco dei valori consentiti contiene migliaia di elementi, perché isin() basato su un insieme è significativamente più veloce di isin() basato su una lista.
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 12Negare isin() con ~
Combini isin() con l'operatore ~ per filtrare le righe in cui una colonna non contiene i valori specificati. Questo è il modo più chiaro per escludere un elenco di valori specifici, molto più leggibile rispetto alla creazione di una catena di confronti !=.
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() con una colonna di DataFrame come elenco
Un espediente molto utile consiste nel passare a isin() i valori della colonna di un altro DataFrame. È equivalente a un semi-join SQL: mantiene in df1 le righe la cui chiave compare in df2. A differenza di un merge completo, non duplica le righe né aggiunge colonne: si limita a filtrare.
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 400Panoramica del metodo between()
between(left, right) restituisce una Series booleana che vale True quando i valori rientrano nell'intervallo chiuso [left, right] (inclusivo per impostazione predefinita). Sostituisce condizioni a due estremi come (df['age'] >= 18) & (df['age'] <= 65) con una singola chiamata leggibile.
Il parametro inclusive controlla l'inclusione dei limiti: 'both' (predefinito), 'left', 'right' oppure '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() con il parametro inclusive
Per impostazione predefinita, entrambi gli estremi sono inclusi nell'intervallo. Impostando inclusive='left' si esclude il limite destro, utile per intervalli semiaperti come i raggruppamenti temporali; inclusive='right' esclude quello sinistro, mentre inclusive='neither' esclude entrambi gli estremi per ottenere un intervallo aperto stretto.
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() sulle colonne di date
between() funziona anche sulle colonne datetime. Passi stringhe di date o oggetti Timestamp come limiti: Pandas eseguirà il confronto sui valori datetime sottostanti. È un modo chiaro per selezionare una finestra temporale senza convertire le date in numeri interi.
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 30Combinare isin() e between()
È possibile combinare isin() e between() nella stessa espressione booleana usando & e |. Si ottengono così filtri compatti e leggibili che altrimenti richiederebbero molte condizioni annidate. Racchiuda sempre ogni chiamata tra parentesi quando le combina.
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() su più colonne con any
Quando desidera verificare se il valore di un elenco è contenuto in una qualsiasi di più colonne, può chiamare isin() sull'intero DataFrame e usare .any(axis=1) per riassumere il risultato riga per riga. È utile per cercare contemporaneamente in più colonne di tag o categorie.
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 InfraSuggerimento sulle prestazioni: isin() contro più ==
Per un elenco ridotto di 2-3 valori, la differenza tra isin() e le condizioni == concatenate è trascurabile. Tuttavia, per elenchi di grandi dimensioni (centinaia di valori), isin() è molto più veloce perché converte internamente l'elenco in un insieme hash ed esegue ricerche O(1) per elemento invece di confronti sequenziali.
Preferisca sempre isin() a una lunga catena di condizioni |, per ottenere codice più pulito e prestazioni migliori.
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)Filtro realistico: catalogo prodotti
Ecco un esempio realistico che combina isin() per filtrare le categorie e between() per filtrare l'intervallo di prezzi, uno schema comune nell'analisi dell'e-commerce. Insieme, i due filtri selezionano esattamente il sottoinsieme di prodotti necessario per una promozione mirata.
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 150Verifica rapida
Verifichi la Sua comprensione dei filtri isin() e between().
Riepilogo della lezione
In questa lezione ha imparato che: isin() verifica l'appartenenza a un insieme ed è più veloce della concatenazione di più condizioni ==; ~isin() esclude un elenco di valori; between() filtra un intervallo chiuso con un parametro inclusive opzionale. Entrambi i metodi funzionano con colonne numeriche, stringa e datetime. Nel prossimo argomento vedremo come selezionare le colonne di un DataFrame che corrispondono a un modello di nome.
Domande Frequenti
La lezione «Filtri isin() e between()» è gratuita?
Sì — il testo completo di «Filtri isin() e between()» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Pandas & NumPy Academy, passa a CoddyKit PRO. Il corso Pandas & NumPy Academy include 4 lezioni in totale.
Cosa imparerò in «Filtri isin() e between()»?
Selezioni le righe in cui il valore di una colonna appartiene a una lista con isin() oppure rientra in un intervallo numerico con between(). Eserciti Pandas & NumPy Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Pandas & NumPy Academy?
Non è richiesta alcuna esperienza precedente. Pandas & NumPy Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Filtri isin() e between()»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Pandas & NumPy Academy?
Sì. Ogni lezione Pandas & NumPy Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Indicizzazione booleana dei DataFrame
- Il metodo query()
- Filtri isin() e between()
- Selezionare colonne in base a un pattern