• analiticas
  • Posts
  • Guida pratica ai tipi di merge() con pandas

Guida pratica ai tipi di merge() con pandas

Scopri le diverse modalità per combinare i tuoi dataframe

La funzione merge() di Pandas ci dà diverse opzioni per unire due dataframe. Ne avevamo parlato brevemente nella micro-lezione di introduzione al metodo merge().

In questa micro-lezione vedremo nel dettaglio come combinare due dataframe scegliendo la modalità di merge() più adatta.

La libreria e i dataframe

Prima di tutto, importiamo la libreria pandas:

import pandas as pd

Creiamo due semplici dataframe (se hai già dei dati su cui stai lavorando puoi saltare questo passaggio).

Nel primo dataframe avremo dei nomi con degli indirizzi email. Il secondo dataframe conterrà invece degli indirizzi email e delle città.

df1 = pd.DataFrame({
    'nome': ['Alice', 'Maria', 'Mario', 'Davide'],
    'email': ['[email protected]', '[email protected]', '[email protected]', '[email protected]']
})


df2 = pd.DataFrame({
    'email': ['[email protected]', '[email protected]', '[email protected]', '[email protected]'],
    'città': ['Roma', 'Milano', 'Napoli', 'Firenze']
})

Ecco come appaiono i nostri dataframe:

df1:

df2:

Nei prossimi esempi useremo la colonna “email” per unire i due dataframe.

La sintassi (base) di merge()

Prima di vedere da vicino i tipi di merge(), è doveroso soffermarsi un attimo sulla sintassi di base di merge().

In questo esempio:

  • df1: è il dataframe di sinistra.

  • df2: è il dataframe di destra

  • on=’email’: indica su che colonna andremo ad unire i dataframe. In questo esempio è la colonna chiamata “email”.

  • how=’inner’: indica il tipo di merge(). Il resto della micro-lezione si concentrerà su quest’ultimo parametro.

I tipi di merge()

Vediamo adesso i quattro tipi valori che possiamo dare al parametro how, quando usiamo merge() .

Inner

pd.merge(how='inner')

L'”inner merge” è il tipo di unione predefinito. Mantiene solo le righe che hanno corrispondenze in entrambi i dataframe.

Vediamo come fare concretamente:

df_inner = pd.merge(df1, df2, on='email', how='inner')

Nota bene

Dato che “inner” è il valore di default, puoi anche omettere il parametro how.

In questo caso abbiamo creato un nuovo dataframe (chiamato df_inner) che è il risultato dell’unione tra df1 e df2 sulla colonna “email”.

La scelta del metodo “inner” fa sì che soltanto le righe con la stessa email in df1 e df2 facciano parte del dataframe finale.

Quindi, df_inner avrà questo aspetto:

nome

email

città

Maria

[email protected]

Milano

Mario

[email protected]

Napoli

Avrai notato che Alice e Davide non fanno parte del dataframe finale: questo è avvenuto perché le loro email erano presenti in df1 ma non in df2.

Left

pd.merge(how='left')

Il “left merge” mantiene tutte le righe del dataframe di sinistra e aggiunge le corrispondenze dal dataframe di destra.

Ecco come fare:

df_left = pd.merge(df1, df2, on='email', how='left')

Ed ecco qui il risultato:

nome

email

città

Alice

[email protected]

NaN

Maria

[email protected]

Milano

Mario

[email protected]

Napoli

Davide

[email protected]

NaN

In questo caso Alice e Davide fanno parte del dataframe finale ma non hanno alcun valore nella colonna “città”.

Questo accade perché i loro indirizzi email non sono presenti in df2.

pd.merge(how='right')

Il “right merge” è l'opposto del “left merge”: mantiene tutte le righe del dataframe di destra e aggiunge le corrispondenze da quello di sinistra.

Ecco come scegliere il metodo “right” nella funzione merge():

df_right = pd.merge(df1, df2, on='email', how='right')

Il risultato è un dataframe con tutte le coppie email-città di df2 e soltanto i nomi di df1 associati ad un indirizzo email contenuto in df2:

nome

email

città

NaN

[email protected]

Roma

Maria

[email protected]

Milano

Mario

[email protected]

Napoli

NaN

[email protected]

Firenze

Outer

pd.merge(how='outer')

L'”outer merge” è il metodo più inclusivo: mantiene tutte le righe di entrambi i dataframe, inserendo valori nulli dove non ci sono corrispondenze.

Ecco come fare:

df_outer = pd.merge(df1, df2, on='email', how='outer')

Nel dataframe finale avremo quindi tutti gli indirizzi email e, se presenti, i nomi e le città ad essi associati:

nome

email

città

Alice

[email protected]

NaN

Maria

[email protected]

Milano

Mario

[email protected]

Napoli

Davide

[email protected]

NaN

NaN

[email protected]

Roma

NaN

[email protected]

Firenze

Quale tipo di merge scegliere?

La scelta dipende dalle tue esigenze:

  • inner: quando vuoi solo i dati con valori in entrambi i dataframe.

  • left o right: quando vuoi mantenere tutti i dati di un dataframe specifico.

  • outer: quando vuoi tutti i dati, indipendentemente dalle corrispondenze.

Conclusione

Conoscere i diversi tipi di merge ti permette di manipolare i tuoi dati con precisione.

Ricorda però di avere ben chiare le caratteristiche dei dataframe che vuoi unire (se hanno valori nulli o duplicati ad esempio). Questo potrebbe evitare di incappare in qualche imprevisto durante le tue analisi.

Alla prossima micro-lezione 👋