Quando si fa analisi dei dati, capita spesso di dover aggiungere nuove colonne a un dataframe.

In questa micro-lezione vedremo come usare il metodo assign() per farlo in maniera pulita ed elegante.

La libreria e il dataframe

Incominciamo importando pandas:

import pandas as pd

Costruiamo un dataframe di esempio che rappresenta le vendite e i costi di alcuni punti vendita:

df = pd.DataFrame({
    'punto_vendita': ['RO2', 'MI3', 'NA1', 'TO8'],
    'città': ['Roma', 'Milano', 'Napoli', 'Torino'],
    'vendite': [1200, 850, 2100, 670],
    'costi': [400, 300, 750, 200]
})

Ecco l’aspetto del nostro dataframe:

punto_vendita

città

vendite

costi

RO2

Roma

1200

400

MI3

Milano

850

300

NA1

Napoli

2100

750

TO8

Torino

670

200

Aggiungere una colonna al dataframe

Senza assign(), aggiungeremmo una colonna così:

df['profitto'] = df['vendite'] - df['costo']

Funziona, ma modifica df direttamente e non si integra bene in una catena di metodi (a tal proposito, vedi la micro-lezione sul chaining).

Con assign():

df = df.assign(profitto=df['vendite'] - df['costo'])

Il risultato è identico, ma la sintassi è più pulita e soprattutto restituisce una copia del dataframe con la nuova colonna aggiunta, senza modificare l'originale.

Attenzione!

Capire e sapere quando si sta lavorando sulla copia di un dataframe o sull’originale è importante per prevenire errori.

Aggiungere più colonne in una sola volta

assign() accetta più argomenti, quindi puoi aggiungere tutte le colonne che vuoi in una sola volta.

In questo esempio aggiungiamo le colonne profitto e commissione:

df = df.assign(
    profitto=df['vendite'] - df['costo'],
    commissione=df['vendite'] * 0.15
)

Nota bene

Quando si usano più colonne con assign(), si possono usare sia valori calcolati direttamente sia funzioni lambda. Le lambda sono più flessibili perché ricevono il dataframe corrente come argomento.

Usare assign() dentro una catena di metodi

Immagina di voler filtrare il dataframe, aggiungere una colonna e riordinare il dataframe.

Con assign() puoi fare tutto ciò in sequenza:

risultato = (
    df
    .query("vendite > 700")
    .assign(profitto=lambda x: x['vendite'] - x['costo'])
    .sort_values('profitto')
)

Tutte le operazione sono in un unico blocco, leggibile dall'alto verso il basso, senza nessuna variabile temporanea.

Fare riferimento a colonne appena create

Con assign() puoi fare riferimento a una colonna che hai appena definito, usando lambda.

In questo esempio aggiungiamo la colonna profitto e poi la utilizzeremo per creare la colonna margine:

df = df.assign(
    profitto=lambda x: x['vendite'] - x['costo'],
    margine=lambda x: (x['profitto'] / x['vendite']).round(2)
)

Attenzione!

Questo funziona solo se usi lambda per entrambe le colonne. Se usi un valore diretto per profitto (es. profitto=df['vendite'] - df['costo']), la colonna profitto non sarà ancora disponibile per la riga successiva.

Conclusione

assign() è uno di quei metodi che fa la differenza tra scrivere codice e scrivere buon codice.

É l’ideale se stai costruendo pipeline di trasformazione dati con pandas ma usarlo può far la differenze anche per le analisi di tutti i giorni.

Alla prossima micro-lezione 👋

Se vuoi imparare la data analysis con micro-lezioni che vanno dritto al sodo, iscriviti alla newsletter: