Corso
PySpark è particolarmente utile quando si lavora con dataset di grandi dimensioni perché offre metodi efficienti per pulire i dati. In questo articolo ci concentriamo su un'attività di pulizia comune: come rimuovere colonne da un DataFrame utilizzando i metodi .drop() e .select() di PySpark.
Per saperne di più su PySpark, dai un'occhiata a questo corso Introduction to PySpark.
Perché eliminare colonne nei DataFrame PySpark?
Eliminare colonne è un'attività comune nel pre-processing dei dati per vari motivi. Rimuovere colonne non necessarie o irrilevanti può ridurre significativamente la quantità di dati da elaborare. Questo rende il dataset più snello, più facile da analizzare e può migliorare le prestazioni dei job PySpark.
Inoltre, quando si prepara un dataset per il machine learning, la selezione delle feature spesso comporta la rimozione di colonne che non contribuiscono all'accuratezza del modello o che potrebbero introdurre rumore. Questo passaggio può portare a modelli più efficienti ed efficaci.
Infine, eliminare colonne può essere una strategia per migliorare la qualità dei dati. Se una colonna contiene un'alta percentuale di valori mancanti o di dati errati, rimuoverla potrebbe essere la scelta migliore.
Come eliminare una singola colonna da un DataFrame PySpark
Supponiamo di avere un DataFrame df con cinque colonne: player_name, player_position, team, minutes_played e score. La colonna minutes_played ha molti valori mancanti, quindi vogliamo eliminarla.
In PySpark possiamo eliminare una singola colonna da un DataFrame usando il metodo .drop().
La sintassi è df.drop("column_name") dove:
dfè il DataFrame da cui vogliamo eliminare la colonnacolumn_nameè il nome della colonna da eliminare.
Il metodo df.drop() restituisce un nuovo DataFrame con le colonne specificate rimosse.
Ecco come possiamo eliminare una colonna:
df_dropped = df.drop("minutes_played")
Come eliminare più colonne da un DataFrame PySpark
Immaginiamo di voler analizzare il nostro DataFrame df senza considerare la squadra o il ruolo del giocatore: vogliamo quindi eliminare entrambe le colonne. Ci sono più modi per farlo, vediamo le opzioni.
Per eliminare più colonne da un DataFrame PySpark, possiamo passare un elenco di nomi di colonne al metodo .drop(). Possiamo farlo in due modi:
# Opzione 1: Passare i nomi come lista
df_dropped = df.drop(["team", "player_position"])
# Opzione 2: Passare i nomi come argomenti separati
df_dropped = df.drop("team", "player_position")
In alternativa, possiamo concatenare più chiamate a .drop(). Anche se funziona, in genere non è l'approccio più efficiente o elegante. Ogni chiamata crea un nuovo DataFrame, il che può introdurre overhead, soprattutto con dataset di grandi dimensioni.
df_dropped = df.drop("team").drop("player_position")
Eliminare colonne in modo condizionale
Invece di specificare quali colonne eliminare, possiamo invertire l'approccio e selezionare solo quelle che soddisfano una condizione o un requisito. In questo modo, il DataFrame restituito non conterrà più le colonne indesiderate.
Usare .select()
Possiamo usare il metodo .select() in PySpark insieme a una list comprehension per eliminare una o più colonne in base a determinati criteri. Il metodo è flessibile e può essere usato da una condizione semplice fino a una più complessa.
Questo metodo segue la sintassi df.select([col for col in df.columns if condition]), dove:
dfè il DataFrame con cui stai lavorando.conditionè il criterio usato per filtrare le colonne che vuoi mantenere.
Lavoriamo di nuovo con il nostro DataFrame df e selezioniamo tutte le colonne tranne la colonna team:
df_sel = df.select([col for col in df.columns if col != "team"])
Condizioni complesse con .selectExpr()
Se hai familiarità con SQL e devi applicare condizioni più complesse nel filtrare le colonne, il metodo .selectExpr() di PySpark offre una soluzione potente. Consente di usare espressioni in stile SQL per selezionare e manipolare colonne direttamente nel codice PySpark.
Per esempio, considera questo caso:
# Seleziona colonne specifiche e crea una nuova colonna 'FullMatch'
df_sel = df.selectExpr("player_name", "player_position", "minutes_played >= 60 as FullMatch")
Qui non stiamo solo escludendo una colonna. Stiamo:
- Selezionando le colonne
player_nameeplayer_position. - Creando una nuova colonna chiamata
FullMatchche indica se un giocatore ha disputato tutta la partita (60 minuti o più).
Questa flessibilità rende .selectExpr() prezioso negli scenari in cui semplici list comprehension potrebbero non essere sufficienti.
Best practice
Quando decidiamo di eliminare colonne dal nostro DataFrame, è fondamentale seguire alcune best practice per mantenere l'integrità dei dati, la leggibilità del codice e l'efficienza.
1. Fai un backup dei dati: prima di apportare qualsiasi modifica al DataFrame, soprattutto quando elimini colonne, è consigliabile creare una copia di backup. In questo modo puoi tornare ai dati originali se necessario.
df_backup = df.persist() # Metti in cache il DataFrame per evitare di ricalcolarlo in seguito
2. Elimina con inplace=False (predefinito): per impostazione predefinita, il metodo .drop() restituisce un nuovo DataFrame senza modificare l'originale. In genere è più sicuro. Se sei assolutamente sicuro di voler modificare il DataFrame originale, puoi usare inplace=True, ma fallo con cautela.
df_dropped = df.drop("column_to_drop", inplace=False) # Comportamento predefinito
3. Documenta le tue decisioni: se stai lavorando a un progetto collaborativo o pensi di tornare sul tuo codice in futuro, è utile aggiungere commenti che spieghino perché hai scelto di eliminare certe colonne. Questa documentazione può fornire contesto prezioso a te e agli altri.
4. Valuta di rinominare le colonne: invece di eliminare colonne, valuta se rinominarle possa essere più appropriato, soprattutto se le informazioni contenute potrebbero essere utili per analisi future. PySpark mette a disposizione il metodo .withColumnRenamed() che aiuta a rinominare le colonne.
Conclusione
In questo tutorial, abbiamo visto come eliminare una o più colonne usando i metodi .drop() e .select(). Abbiamo anche descritto metodi alternativi per sfruttare espressioni SQL se servono tecniche di selezione più complesse.
Se vuoi ampliare le tue competenze e sfruttare le potenti tecniche di PySpark, prendi in considerazione questi corsi e materiali:
FAQ
Come faccio a eliminare colonne in base a una regex in PySpark?
Per eliminare colonne in base a un pattern regex in PySpark, puoi filtrare i nomi delle colonne usando una list comprehension e il modulo re (per le espressioni regolari), quindi passare l'elenco filtrato al metodo .drop().
Come faccio a eliminare colonne con lo stesso nome in PySpark?
PySpark non consente nomi di colonna duplicati all'interno di un DataFrame. Se la tua sorgente dati ha nomi duplicati, probabilmente otterrai un errore durante la creazione del DataFrame. La best practice è risolvere i duplicati alla fonte o durante la creazione del DataFrame.
Come faccio a eliminare colonne con soli valori null in PySpark?
Per eliminare colonne che contengono solo valori null in PySpark, possiamo prima calcolare il conteggio dei null in ogni colonna usando count(when(col(c).isNull(), c)). Poi identifichiamo le colonne in cui il numero di null è uguale al numero totale di righe del DataFrame. Infine, eliminiamo queste colonne usando il metodo .drop().
Come faccio a eliminare colonne in modo condizionale in PySpark?
Usa df.select([col for col in df.columns if condition]).


