Introduzione
Pandas è una delle librerie più importanti dell’ecosistema Python per l’analisi dei dati. Quando si inizia a lavorare con i DataFrame, una delle abilità più utili non è solo caricare i dati, ma selezionare rapidamente le righe giuste, ordinare i risultati e applicare filtri leggibili. Queste operazioni sono fondamentali in quasi ogni progetto: dall’analisi di vendite, al monitoraggio di KPI, fino alla preparazione di dataset per machine learning.
In questo tutorial vedremo un sotto-argomento molto pratico: come filtrare, ordinare e selezionare dati in Pandas. È un tema spesso sottovalutato, ma in realtà rappresenta il cuore del lavoro quotidiano con i DataFrame. Imparerai a usare selezione per colonne, filtri condizionali, ordinamento e metodi utili per esplorare sottoinsiemi di dati in modo chiaro e sicuro.
Useremo un esempio realistico: un piccolo dataset di ordini e-commerce con informazioni su cliente, categoria, prezzo, quantità e stato dell’ordine. L’obiettivo è capire come estrarre insight utili senza scrivere codice complicato.
Codice completo
import pandas as pd
# Dataset di esempio: ordini e-commerce
dati = [
{"ordine_id": 1, "cliente": "Anna", "categoria": "Libri", "prezzo": 18.90, "quantita": 2, "stato": "consegnato"},
{"ordine_id": 2, "cliente": "Marco", "categoria": "Elettronica","prezzo": 249.99, "quantita": 1, "stato": "spedito"},
{"ordine_id": 3, "cliente": "Giulia", "categoria": "Casa", "prezzo": 35.50, "quantita": 3, "stato": "consegnato"},
{"ordine_id": 4, "cliente": "Luca", "categoria": "Libri", "prezzo": 12.00, "quantita": 1, "stato": "annullato"},
{"ordine_id": 5, "cliente": "Sara", "categoria": "Sport", "prezzo": 59.90, "quantita": 2, "stato": "consegnato"},
{"ordine_id": 6, "cliente": "Paolo", "categoria": "Elettronica","prezzo": 99.00, "quantita": 4, "stato": "spedito"},
{"ordine_id": 7, "cliente": "Elena", "categoria": "Casa", "prezzo": 22.75, "quantita": 2, "stato": "consegnato"},
{"ordine_id": 8, "cliente": "Marta", "categoria": "Sport", "prezzo": 120.00, "quantita": 1, "stato": "consegnato"},
]
df = pd.DataFrame(dati)
# Aggiungiamo una colonna utile: totale ordine
df["totale"] = df["prezzo"] * df["quantita"]
print("DataFrame completo:")
print(df)
# 1) Selezione di una singola colonna
print("nSolo la colonna ´cliente´:")
print(df["cliente"])
# 2) Selezione di più colonne
print("nColonne selezionate:")
print(df[["cliente", "categoria", "totale"]])
# 3) Filtrare righe con una condizione
ordini_consegnati = df[df["stato"] == "consegnato"]
print("nOrdini consegnati:")
print(ordini_consegnati)
# 4) Filtrare con più condizioni
ordini_costosi_consegnati = df[(df["stato"] == "consegnato") & (df["totale"] > 100)]
print("nOrdini consegnati con totale > 100:")
print(ordini_costosi_consegnati)
# 5) Usare isin() per filtrare valori multipli
categorie_interessanti = df[df["categoria"].isin(["Libri", "Sport"])]
print("nOrdini nelle categorie Libri o Sport:")
print(categorie_interessanti)
# 6) Ordinare per una colonna
ordinati_per_totale = df.sort_values(by="totale", ascending=False)
print("nOrdini ordinati per totale decrescente:")
print(ordinati_per_totale)
# 7) Ordinare per più colonne
ordinati_per_stato_e_totale = df.sort_values(by=["stato", "totale"], ascending=[True, False])
print("nOrdinati per stato e poi totale:")
print(ordinati_per_stato_e_totale)
# 8) Selezionare righe per posizione con iloc
prime_tre_righe = df.iloc[:3]
print("nPrime tre righe:")
print(prime_tre_righe)
# 9) Selezionare righe e colonne per etichette con loc
selezione_precisa = df.loc[df["totale"] > 50, ["cliente", "categoria", "totale"]]
print("nClienti con totale > 50 e colonne specifiche:")
print(selezione_precisa)
# 10) Creare una vista più leggibile con reset_index
filtrato_reset = ordini_consegnati.reset_index(drop=True)
print("nOrdini consegnati con indice resettato:")
print(filtrato_reset) Spiegazione
Vediamo ora il codice passo per passo, perché ogni operazione ha un ruolo preciso nel flusso di lavoro con Pandas.
1. Creazione del DataFrame
Partiamo da una lista di dizionari e la convertiamo in un DataFrame con pd.DataFrame(dati). Questo è un formato molto comune quando i dati arrivano da API, file JSON o strutture Python già in memoria.
2. Creare una colonna derivata
La colonna totale viene calcolata moltiplicando prezzo per quantita. In analisi reali, le colonne derivate sono spesso più importanti dei dati originali, perché permettono di costruire metriche utili come ricavo, margine, durata media, tasso di conversione e così via.
3. Selezione di colonne
Con df["cliente"] ottieni una Series, cioè una singola colonna. Con df[["cliente", "categoria", "totale"]] ottieni invece un DataFrame contenente solo le colonne richieste. Questa distinzione è importante: una Series rappresenta un vettore monodimensionale, mentre un DataFrame è una tabella bidimensionale.
4. Filtrare righe con una condizione
Espressioni come df[df["stato"] == "consegnato"] sono tra le più usate in assoluto. La condizione produce una maschera booleana: una sequenza di True e False che Pandas usa per tenere solo le righe valide.
5. Combinare più condizioni
Per combinare filtri devi usare gli operatori bitwise & e |, non and e or. Inoltre ogni condizione va racchiusa tra parentesi tonde. Per esempio:
(df["stato"] == "consegnato") & (df["totale"] > 100)
Questo è un punto in cui molti principianti sbagliano: in Pandas le parentesi non sono opzionali.
6. Filtrare con isin()
Il metodo isin() è perfetto quando vuoi verificare se un valore appartiene a un insieme di possibilità. Nel nostro esempio cerchiamo ordini nelle categorie Libri o Sport. È molto più leggibile che scrivere una lunga sequenza di confronti.
7. Ordinamento dei dati
Con sort_values() puoi ordinare il DataFrame in base a una o più colonne. Ordinare per totale in ordine decrescente è utile per trovare gli ordini più importanti. Ordinare per più colonne ti permette di definire criteri gerarchici, ad esempio prima per stato e poi per valore economico.
8. Selezione per posizione con iloc
iloc lavora con indici numerici basati sulla posizione. df.iloc[:3] restituisce le prime tre righe. È utile quando vuoi fare campionamenti rapidi, controlli visivi o estrarre porzioni del dataset senza dipendere dai nomi degli indici.
9. Selezione per etichette con loc
loc è più espressivo quando vuoi combinare un filtro con una selezione di colonne. Nel nostro caso:
df.loc[df["totale"] > 50, ["cliente", "categoria", "totale"]]
significa: “dammi solo le righe con totale maggiore di 50 e mostrami solo queste colonne”. È una delle forme più pratiche e leggibili di query su DataFrame.
10. Reset dell’indice
Dopo un filtro, l’indice originale viene mantenuto. Questo è corretto dal punto di vista dei dati, ma a volte rende il risultato meno leggibile. Con reset_index(drop=True) ottieni un indice ordinato da 0 in poi, più comodo per la consultazione o l’esportazione.
Best practice
- Usa sempre parentesi quando combini condizioni booleane con & e |. Evita errori di precedenza degli operatori.
- Preferisci loc e iloc quando vuoi rendere il codice più esplicito. Sono più leggibili rispetto a selezioni complesse con slicing implicito.
- Evita di modificare il DataFrame originale senza motivo. Se stai facendo esperimenti, crea una copia con df.copy().
- Ordina solo quando serve. Il sorting su dataset grandi può costare tempo e memoria, quindi usalo in modo mirato.
- Usa isin() per confronti multipli invece di concatenare tanti ==. Il codice diventa più pulito e facile da mantenere.
- Rinomina e crea colonne derivate con criterio. Un nome chiaro come totale o ricavo aiuta molto nella lettura del notebook o dello script.
- Controlla sempre il tipo dei dati. Un filtro su valori numerici può fallire o dare risultati inattesi se la colonna è stata letta come stringa.
Riepilogo
In questo tutorial abbiamo visto come lavorare in modo pratico con tre operazioni fondamentali di Pandas: selezionare, filtrare e ordinare i dati. Sono competenze essenziali perché ti permettono di passare rapidamente da un DataFrame completo a una vista mirata e utile per l’analisi.
Abbiamo imparato a:
- selezionare una o più colonne;
- filtrare righe con condizioni semplici e multiple;
- usare isin() per confronti su insiemi di valori;
- ordinare con sort_values();
- estrarre sottoinsiemi con loc e iloc;
- ripulire l’indice con reset_index().
Se impari a usare bene questi strumenti, la maggior parte delle attività di esplorazione dati diventerà molto più veloce e leggibile. In pratica, non stai solo scrivendo codice: stai costruendo una pipeline di analisi chiara, ripetibile e facile da mantenere.
Approfondisci con risorse ufficiali
- Documentazione ufficiale Pandas: https://pandas.pydata.org/docs/
- Indexing and selecting data: https://pandas.pydata.org/docs/user_guide/indexing.html
- Sorting: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.sort_values.html
- Boolean indexing: https://pandas.pydata.org/docs/user_guide/indexing.html#boolean-indexing
- Loc e iloc: https://pandas.pydata.org/docs/user_guide/indexing.html#selection-by-label
