0Pricing
Pandas & NumPy Academy · Lezione

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     True

Applicazione 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     2000

Condizioni 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   3979576

Combinazione 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   70000

Combinazione 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  Accessories

Negazione 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   refunded

Filtraggio 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    200

Filtraggio 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    8000

Utilizzo 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  Pass

Assegnazione 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     Available

Conteggio 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     70

Verifica 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

  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