Introduzione a Pandas: lavorare con i dati mancanti in modo efficace

by theArchitect
SHARE
Introduzione a Pandas: lavorare con i dati mancanti in modo efficace
© Guida-HTML5.it

Introduzione

Pandas è una delle librerie più utilizzate in Python per l’analisi dei dati, perché offre strumenti pratici per leggere, trasformare e pulire tabelle in modo veloce. Tra i problemi più comuni nei dataset reali c’è la presenza di dati mancanti: valori assenti, celle vuote, informazioni non disponibili o record incompleti.

Saper gestire i dati mancanti è fondamentale, perché può influenzare in modo significativo l’analisi finale. Un valore mancante può falsare una media, impedire un calcolo, rompere un modello o rendere poco affidabile un report. In questo tutorial vedremo come individuare, analizzare e trattare i valori mancanti con Pandas, usando un esempio pratico e realistico.

L’obiettivo non è solo imparare alcune funzioni, ma capire quando usarle e perché. Questo approccio è molto utile in contesti professionali, dove i dati raramente arrivano già puliti.

Codice completo

import pandas as pd
import numpy as np

# Dataset di esempio: vendite mensili di alcuni prodotti
dati = {
    "prodotto": ["Laptop", "Mouse", "Tastiera", "Monitor", "Webcam", "Cuffie"],
    "categoria": ["Elettronica", "Accessori", "Accessori", "Elettronica", None, "Accessori"],
    "prezzo": [1200, 25, np.nan, 300, 70, 45],
    "quantita": [5, 40, 15, None, 25, 30],
    "sconto_percentuale": [10, None, 5, 8, 12, None]
}

df = pd.DataFrame(dati)

print("DataFrame iniziale:")
print(df)
print("n")

# 1. Verificare la presenza di valori mancanti
print("Valori mancanti per colonna:")
print(df.isna().sum())
print("n")

# 2. Rimuovere righe con troppi dati mancanti
# Esempio: eliminiamo le righe che hanno almeno 2 valori mancanti
df_pulito = df.dropna(thresh=4).copy()

print("DataFrame dopo dropna(thresh=4):")
print(df_pulito)
print("n")

# 3. Sostituire i valori mancanti con valori sensati
# categoria: riempiamo con "Sconosciuta"
df_pulito["categoria"] = df_pulito["categoria"].fillna("Sconosciuta")

# prezzo: sostituiamo con la media dei prezzi disponibili
media_prezzo = df_pulito["prezzo"].mean()
df_pulito["prezzo"] = df_pulito["prezzo"].fillna(media_prezzo)

# quantita: sostituiamo con la mediana, più robusta della media
mediana_quantita = df_pulito["quantita"].median()
df_pulito["quantita"] = df_pulito["quantita"].fillna(mediana_quantita)

# sconto_percentuale: sostituiamo con 0, se lo sconto non è stato specificato
df_pulito["sconto_percentuale"] = df_pulito["sconto_percentuale"].fillna(0)

print("DataFrame dopo il riempimento dei valori mancanti:")
print(df_pulito)
print("n")

# 4. Calcolare una nuova colonna: prezzo finale
# prezzo_finale = prezzo - (prezzo * sconto / 100)
df_pulito["prezzo_finale"] = df_pulito["prezzo"] * (1 - df_pulito["sconto_percentuale"] / 100)

print("DataFrame con prezzo finale:")
print(df_pulito)
print("n")

# 5. Individuare eventuali valori ancora mancanti
print("Valori mancanti residui:")
print(df_pulito.isna().sum())

Spiegazione

Partiamo dal dataset. Immagina di avere un piccolo catalogo prodotti con alcune informazioni incomplete: categoria, prezzo, quantità e sconto. Questo è un caso realistico, perché nei dati aziendali spesso alcuni campi non vengono compilati.

1. Individuare i valori mancanti

Il metodo isna() restituisce una struttura booleana: True dove il dato manca, False dove è presente. Usandolo insieme a sum() possiamo contare quanti valori mancanti ci sono per colonna.

Questa operazione è utile per capire la qualità del dataset prima di intervenire. Se una colonna ha troppi valori assenti, forse conviene eliminarla o gestirla con attenzione.

2. Eliminare righe incomplete

Con dropna() possiamo rimuovere righe o colonne che contengono valori mancanti. Nel codice usiamo thresh=4, che significa: mantieni solo le righe con almeno 4 valori non mancanti su 5.

Questa strategia è utile quando i record molto incompleti non sono affidabili. Però va usata con cautela, perché eliminare troppe righe può ridurre troppo il dataset.

3. Sostituire i valori mancanti

Molto spesso non conviene eliminare i dati, ma riempirli in modo intelligente. Qui entrano in gioco fillna() e alcune scelte pratiche:

  • categoria: viene riempita con "Sconosciuta", una stringa esplicita e leggibile.
  • prezzo: viene sostituito con la media, utile quando i valori sono numerici e distribuiti in modo abbastanza regolare.
  • quantita: viene usata la mediana, spesso migliore della media quando ci sono valori anomali.
  • sconto_percentuale: viene impostato a 0, una scelta sensata se il mancato inserimento equivale a nessuno sconto.

La scelta del valore di riempimento dipende sempre dal contesto. Non esiste una soluzione universale: bisogna capire il significato del dato.

4. Creare nuove colonne con dati puliti

Dopo la pulizia, possiamo fare analisi più affidabili. Nel tutorial calcoliamo prezzo_finale, cioè il prezzo scontato. Questo è un esempio semplice ma molto realistico: in molti casi, la pulizia dei dati è il passaggio necessario prima di creare metriche o KPI.

5. Verificare il risultato finale

Alla fine controlliamo di nuovo i valori mancanti con isna().sum(). Questa verifica è importante: ti conferma che il dataset è pronto per le fasi successive, come aggregazioni, grafici o esportazione.

Best practice

  • Analizza sempre i dati mancanti prima di intervenire: non eliminare o riempire colonne “a occhi chiusi”.
  • Usa strategie diverse in base al tipo di dato: media e mediana per numeri, stringhe descrittive per categorie, valori di default solo quando hanno senso.
  • Evita di usare la media in presenza di outlier forti: in questi casi la mediana è spesso più robusta.
  • Fai una copia del DataFrame quando lavori in modo progressivo: usare .copy() aiuta a evitare effetti collaterali indesiderati.
  • Documenta le scelte di pulizia: in un progetto reale è importante sapere perché un valore è stato riempito o una riga è stata rimossa.
  • Controlla sempre il significato del valore mancante: un campo vuoto può indicare “non disponibile”, “non applicabile” oppure “errore di acquisizione”. Sono casi diversi.

Riepilogo

Gestire i dati mancanti è una competenza essenziale quando si lavora con Pandas. In questo tutorial hai visto come:

  • identificare i valori mancanti con isna();
  • contare i mancanti per colonna;
  • eliminare righe incomplete con dropna();
  • riempire i valori assenti con fillna();
  • scegliere una strategia diversa a seconda del tipo di dato;
  • verificare il risultato finale prima di proseguire con l’analisi.

La vera abilità non sta solo nel conoscere le funzioni, ma nel decidere quale trattamento è più adatto al contesto. Un buon data analyst o sviluppatore Python non si limita a “sistemare” i dati: li interpreta.

Approfondisci con risorse ufficiali

SHARE