Indicizzazione booleana dei DataFrame
Filtri le righe applicando una condizione booleana a una colonna e combinando più condizioni con gli operatori & e |.
Indicizzazione booleana dei DataFrame è una lezione Pandas & NumPy Academy gratuita su CoddyKit. Questa è la lezione 1 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.
Che cos'è l'indicizzazione booleana?
L'indicizzazione booleana consente di filtrare le righe di un DataFrame applicando una condizione che produce una Series di valori True e False. Vengono restituite solo le righe per cui la condizione è True. È una delle tecniche di selezione più utilizzate in Pandas, perché è leggibile e veloce.
Ad esempio, dato un DataFrame delle vendite, è possibile recuperare immediatamente tutte le righe in cui il ricavo ha superato 1000 senza scrivere un ciclo.
import pandas as pd
df = pd.DataFrame({
'product': ['A', 'B', 'C', 'D'],
'revenue': [500, 1500, 800, 2000]
})
# Boolean condition produces a Series of True/False
mask = df['revenue'] > 1000
print(mask)
# 0 False
# 1 True
# 2 False
# 3 TrueApplicazione della maschera booleana
Una volta ottenuta una maschera booleana, la si passa tra parentesi quadre del DataFrame per selezionare solo le righe corrispondenti. Il risultato è un nuovo DataFrame: l'originale non viene mai modificato. Gli indici delle righe originali vengono mantenuti, così è sempre possibile sapere da dove proviene ogni riga.
Questo schema, cioè creare la maschera e poi applicarla, è l'idioma standard di Pandas per il filtraggio delle righe.
import pandas as pd
df = pd.DataFrame({
'product': ['A', 'B', 'C', 'D'],
'revenue': [500, 1500, 800, 2000]
})
mask = df['revenue'] > 1000
filtered = df[mask]
print(filtered)
# product revenue
# 1 B 1500
# 3 D 2000Condizioni inline senza una variabile maschera
Non è necessario assegnare la Series booleana a una variabile. È possibile scrivere la condizione inline, direttamente tra le parentesi: df[df['col'] > value]. Questo stile su una sola riga è molto comune nei notebook di analisi dei dati, perché mantiene il codice compatto e leggibile.
Entrambi gli approcci, con variabile maschera e inline, producono risultati identici. Utilizzi una variabile quando la condizione è complessa o viene riutilizzata; usi la forma inline per filtri semplici e utilizzati una sola volta.
import pandas as pd
df = pd.DataFrame({
'city': ['NYC', 'LA', 'Chicago', 'Houston'],
'population': [8_336_817, 3_979_576, 2_693_976, 2_320_268]
})
# Inline boolean filter
large_cities = df[df['population'] > 3_000_000]
print(large_cities)
# city population
# 0 NYC 8336817
# 1 LA 3979576Combinazione di condizioni con & (AND)
Per richiedere che siano vere entrambe le condizioni, le combini con l'operatore &, non con la parola chiave Python and, che non funziona elemento per elemento sugli array. Ogni condizione deve essere racchiusa tra parentesi, perché & ha una precedenza maggiore rispetto agli operatori di confronto.
Il risultato mantiene solo le righe per cui ogni sottocondizione restituisce True.
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Carol', 'Dave'],
'age': [25, 35, 28, 45],
'salary': [50000, 90000, 70000, 120000]
})
# Both conditions must be true
result = df[(df['age'] > 27) & (df['salary'] > 60000)]
print(result)
# name age salary
# 1 Bob 35 90000
# 2 Carol 28 70000Combinazione di condizioni con | (OR)
Utilizzi l'operatore | per mantenere le righe in cui è vera almeno una condizione. Come per &, ogni sottocondizione deve essere racchiusa tra parentesi. L'operatore | esegue un OR logico elemento per elemento sugli array booleani.
È perfettamente valido combinare & e |; presti solo attenzione alle parentesi per imporre l'ordine di valutazione corretto ed evitare errori logici difficili da individuare.
import pandas as pd
df = pd.DataFrame({
'product': ['Laptop', 'Mouse', 'Monitor', 'Keyboard'],
'price': [1200, 25, 300, 80],
'category': ['Electronics', 'Accessories', 'Electronics', 'Accessories']
})
# Rows where price > 200 OR category is Accessories
result = df[(df['price'] > 200) | (df['category'] == 'Accessories')]
print(result)
# product price category
# 0 Laptop 1200 Electronics
# 1 Mouse 25 Accessories
# 2 Monitor 300 Electronics
# 3 Keyboard 80 AccessoriesNegazione di una condizione con ~
L'operatore tilde ~ inverte una Series booleana: trasforma True in False e viceversa. Utilizzi ~ per esprimere una logica 'NOT', mantenendo le righe che non corrispondono a una condizione. È più chiaro che costruire manualmente la condizione opposta.
Ad esempio, df[~df['status'].isin(['cancelled', 'refunded'])] mantiene tutte le righe tranne quelle con questi due stati.
import pandas as pd
df = pd.DataFrame({
'order_id': [1, 2, 3, 4],
'status': ['shipped', 'cancelled', 'delivered', 'refunded']
})
# Keep only rows that are NOT cancelled
active = df[~(df['status'] == 'cancelled')]
print(active)
# order_id status
# 0 1 shipped
# 2 3 delivered
# 3 4 refundedFiltraggio di valori stringa
L'indicizzazione booleana funziona altrettanto bene sulle colonne di testo. È possibile filtrare una corrispondenza esatta con == oppure utilizzare metodi .str come .str.startswith(), .str.contains() o .str.upper() nella condizione per un filtraggio flessibile del testo.
Per impostazione predefinita, i confronti tra stringhe in Pandas distinguono tra maiuscole e minuscole, quindi 'NYC' e 'nyc' vengono trattati come valori diversi. Se necessario, normalizzi prima la distinzione tra maiuscole e minuscole.
import pandas as pd
df = pd.DataFrame({
'country': ['USA', 'Germany', 'UK', 'USA', 'France'],
'sales': [400, 200, 150, 600, 300]
})
# Filter rows where country equals USA
us_sales = df[df['country'] == 'USA']
print(us_sales)
# country sales
# 0 USA 400
# 3 USA 600
# Filter rows where country starts with 'G'
g_countries = df[df['country'].str.startswith('G')]
print(g_countries)
# country sales
# 1 Germany 200Filtraggio su più colonne
Le analisi complesse richiedono spesso condizioni su più colonne, combinate con & e |. Suddivida le condizioni molto lunghe in Series booleane denominate per migliorare la leggibilità: ciascuna agisce come un sottofiltro denominato da combinare alla fine.
Questo approccio rende chiara l'intenzione: ogni riga si legge come una frase che descrive una parte della logica del filtro.
import pandas as pd
df = pd.DataFrame({
'region': ['North', 'South', 'North', 'East'],
'year': [2022, 2023, 2023, 2022],
'profit': [5000, -200, 8000, 3000]
})
is_north = df['region'] == 'North'
is_2023 = df['year'] == 2023
is_profitable = df['profit'] > 0
result = df[is_north & is_2023 & is_profitable]
print(result)
# region year profit
# 2 North 2023 8000Utilizzo di np.where per colonne condizionali
L'indicizzazione booleana filtra le righe, ma a volte si desidera aggiungere una nuova colonna in base a una condizione anziché eliminare righe. np.where(condition, value_if_true, value_if_false) è l'equivalente vettorializzato di un if/else applicato elemento per elemento a una colonna ed è molto più veloce di apply con una lambda.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'score': [45, 72, 88, 61, 95]
})
# Create a new column based on a condition
df['grade'] = np.where(df['score'] >= 70, 'Pass', 'Fail')
print(df)
# score grade
# 0 45 Fail
# 1 72 Pass
# 2 88 Pass
# 3 61 Fail
# 4 95 PassAssegnazione di valori a un sottoinsieme filtrato
È possibile aggiornare sul posto i valori delle righe filtrate utilizzando .loc[mask, column]. Questo è il modo sicuro per impostare i valori in un sottoinsieme; l'indicizzazione concatenata, come df[mask]['col'] = value, può generare un SettingWithCopyWarning perché opera su una copia.
Preferisca sempre df.loc[mask, 'col'] = value quando desidera modificare direttamente il DataFrame originale.
import pandas as pd
df = pd.DataFrame({
'item': ['A', 'B', 'C', 'D'],
'stock': [0, 5, 0, 12]
})
# Mark out-of-stock items
df.loc[df['stock'] == 0, 'status'] = 'Out of Stock'
df.loc[df['stock'] > 0, 'status'] = 'Available'
print(df)
# item stock status
# 0 A 0 Out of Stock
# 1 B 5 Available
# 2 C 0 Out of Stock
# 3 D 12 AvailableConteggio e somma della maschera
Poiché internamente i valori booleani sono 1 (True) e 0 (False), è possibile chiamare .sum() su una maschera per contare le righe corrispondenti oppure .mean() per ottenere la frazione di righe corrispondenti. Questi conteggi rapidi aiutano a verificare la logica del filtro prima di applicarlo per selezionare le righe.
import pandas as pd
df = pd.DataFrame({'value': [10, 55, 30, 80, 20, 70]})
mask = df['value'] > 40
print('Count of rows > 40:', mask.sum()) # 3
print('Fraction > 40:', mask.mean().round(2)) # 0.5
# Now apply
print(df[mask])
# value
# 1 55
# 3 80
# 5 70Verifica rapida
Verifichi la comprensione dell'indicizzazione booleana sui DataFrame.
Riepilogo della lezione
In questa lezione ha imparato che: le maschere booleane filtrano le righe applicando una condizione a una colonna, gli operatori & e | combinano più condizioni (non and/or di Python) e ~ inverte una maschera booleana per la logica NOT. Utilizzi df.loc[mask, col] = value per assegnare in modo sicuro i valori alle righe filtrate. Prossimamente esploreremo il metodo query() per scrivere filtri come stringhe leggibili.
Domande Frequenti
La lezione «Indicizzazione booleana dei DataFrame» è gratuita?
Sì — il testo completo di «Indicizzazione booleana dei DataFrame» è 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 «Indicizzazione booleana dei DataFrame»?
Filtri le righe applicando una condizione booleana a una colonna e combinando più condizioni con gli operatori & e |. 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 1 di 4.
Quanto tempo richiede la lezione «Indicizzazione booleana dei DataFrame»?
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