0Pricing
Pandas & NumPy Academy · Lezione

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    600

isin() 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   12

Negare 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     500

isin() 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      400

Panoramica 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   45

between() 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     50

between() 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     30

Combinare 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      300

isin() 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     Infra

Suggerimento 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    150

Verifica 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

  1. Indicizzazione booleana dei DataFrame
  2. Il metodo query()
  3. Filtri isin() e between()
  4. Selezionare colonne in base a un pattern
← Torna a Pandas & NumPy Academy