Merge Pandas: come fare la JOIN tra due Dataframe

Il metodo merge permette di combinare i dati di due DataFrame di pandas con Python, in modo analogo a quanto fatto in SQL con l’istruzione JOIN per combinare i dati. In questo articolo descriviamo la sintassi del metodo merge e ne vediamo alcuni esempi di utilizzo.

Sintassi merge tra dataframe di pandas e confronto con inner join

Partiamo dall’esempio più semplice, cioè la sintassi per effettuare una merge tra due DataFrame analoga a una INNER JOIN in SQL.

Se in SQL scriviamo una query come

SELECT *
FROM Prodotti
INNER JOIN Categorie
  ON Prodotti.IdCategoria = Categorie.IdCategoria;

con pandas utilizzeremo il metodo merge con questi parametri:

  • i nomi dei due DataFrame da combinare;
  • la tipologia di merge nel parametro how (in questo caso inner che è anche il valore di default);
  • le colonne da utilizzare per combinare i due Dataframe nei rispettivi parametri left_on e right_on.

Scriveremo dunque

pd.merge(Prodotti, 
         Categorie, 
         how = "inner",
         left_on = "IdCategoria", 
         right_on = "IdCategoria")

Differenze tra Merge di pandas e Join SQL

Vediamo in questo paragrafo le principali differenze tra la merge di pandas e la Join di SQL

Merge con colonne di tipo differente

Per prima cosa è importante osservare che su pandas non è possibile inserire due colonne nei rispettivi parametri left_on e right_on con particolari combinazioni di tipi. Provando ad esempio a eseguire una merge utilizzando una colonna object e una int64, otteniamo un errore del tipo

You are trying to merge on object and int64 columns. If you wish to proceed you should use pd.concat

Ciò avviene anche per tipi molto simili come int64 e Int64 (a differenza del primo, il secondo dà la possibilità di inserire null all’interno della colonna). Un database relazionale come SQL Server tenterebbe invece di eseguire la conversione implicita della stringa in intero e poi, eventualmente, restituire errore solo in caso di valori non convertibili. La join tra int64 e float è invece possibile.

Nome delle colonne dopo la merge

Riprendendo l’esempio del paragrafo precedente, la colonna IdCategoria utilizzata per combinare i dati sarà riportata nell’output una sola volta. Nel caso invece siano presenti altre colonne con nome comune nei due Dataframe, nell’output esse saranno disambiguate dai suffissi “_x” e “_y“. Tali suffissi possono essere configurati con il parametro opzionale suffixes. Esso deve essere valorizzato con una tupla di due elementi, ad esempio:

 (“_prima_tabella”, “_seconda_tabella”)

Gestione dei null in merge e Join

Questa forse è la differenza più grande tra la sintassi SQL e quella di pandas: due righe nelle tabelle con entrambi null nella colonna utilizzata per la merge o per la join, risultano “corrispondenti” su pandas e “NON corrispondenti” su SQL.

Condizioni di Join più complesse

Nella clausola ON dell’SQL abbiamo piena libertà e possiamo scrivere qualsiasi condizione. Su pandas posso implementare facilmente condizioni come

ON Tabella1.Nome = Tabella2.Nome AND Tabella2.Cognome AND Tabella2.Cognome 

valorizzando i parametri left_on e right_on con degli array. In questo caso scriverei ad esempio

left_on = [“Nome”,”Cognome”],

right_on = [“Nome”, “Cognome”]

Tuttavia se volessi eseguire delle JOIN con condizioni più complesse, dovrei aggiungere alla merge operazioni successive di filtro (in questo articolo https://www.yimp.it/analisi-dei-dati-con-pandas-e-confronto-con-sql/ trovi la sintassi per eseguire su pandas operazioni simili alla Where e alla GroupBy SQL).

Left, Right, Full e Cross join in Pandas

Per eseguire le diverse tipologie di merge, analogamente alle diverse tipologie di Join SQL, possiamo utilizzare il parametro how del metodo merge. In particolare, in modo simile all’SQL, possiamo utilizzare i valori:

  • inner (che è anche il valore di default);
  • left;
  • right;
  • outer;
  • cross.

L’unico valore non ovvio è “outer” che corrisponde alla FULL JOIN di SQL.

Parametro validate della merge

Il metodo merge ha un utilissimo parametro opzionale che permette di generare un errore nel caso alcune tra le colonne utilizzate nei parametri left_on e right_on non contengano valori univoci. Il nome di tale parametro è validate. Ad esempio, questo codice genera un errore se la colonna IdCliente del DataFrame Clienti non ha valori univoci.

pd.merge(Fatture, 
         Clienti, 
         how = "inner",
         left_on = "IdCliente", 
         right_on = "IdCliente",
         validate = "m:1")

Continua a imparare

Torna in alto
Torna su