Unisci i DataFrame di Pandas sull'indice

Manav Narula 25 aprile 2021
  1. Usa merge() per combinare due Pandas DataFrame sull’indice
  2. Usa join() per combinare due Pandas DataFrame sull’indice
Unisci i DataFrame di Pandas sull'indice

Nel mondo della scienza dei dati e dell’apprendimento automatico, è essenziale essere fluenti nelle operazioni di organizzazione, manutenzione e pulizia dei dati per ulteriori analisi. L’unione di due DataFrame è un esempio di una di queste operazioni. Si scopre che è facile combinare due DataFrame utilizzando la libreria Pandas in Python.

Pandas ci fornisce due utili funzioni, merge() e join() per combinare due DataFrame. Entrambi questi metodi sono molto simili ma merge() è considerato più versatile e flessibile. Fornisce inoltre molti parametri per modificare il comportamento del DataFrame finale. join() combina i due DataFrame sui loro indici, mentre merge() ci permette di specificare le colonne che possono fungere da chiave per unire due DataFrame.

Un parametro comune di entrambe queste funzioni su cui si dovrebbe avere familiarità è come, che definisce il tipo di join. Di default il parametro how è inner per merge() e left per join(), ma per entrambi può essere cambiato in left, right, inner e outer. È essenziale conoscere la differenza tra tutti loro.

Combinando due Pandas DataFrame, assumiamo che uno sia il DataFrame sinistro e l’altro il DataFrame destro. Sia merge() che join() corrispondono ai record delle colonne chiave. Il join interno restituisce un DataFrame di record che corrispondono in entrambi i DataFrame. Il join esterno produce un DataFrame unito con tutti gli elementi in entrambi i DataFrame, riempiendo NaN per i valori mancanti su entrambi i lati. Il join left contiene tutti gli elementi del DataFrame sinistro ma solo i record corrispondenti del DataFrame destro. L’opposto di left è right, che contiene tutti gli elementi del DataFrame destro e solo i record corrispondenti del DataFrame sinistro. Tutto questo sarà più chiaro nel codice di esempio nelle prossime sezioni in cui combineremo i DataFrame nel codice seguente:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(["a", "b", "d", "e", "h"], index=[1, 2, 4, 5, 7], columns=["C1"])
df2 = pd.DataFrame(
    ["AA", "BB", "CC", "EE", "FF"], index=[1, 2, 3, 5, 6], columns=["C2"]
)

print(df1)
print(df2)

Produzione:

  C1
1  a
2  b
4  d
5  e
7  h
   C2
1  AA
2  BB
3  CC
5  EE
6  FF

Usa merge() per combinare due Pandas DataFrame sull’indice

Quando si uniscono due DataFrame sull’indice, il valore dei parametri left_index e right_index della funzione merge() dovrebbe essere True. Il seguente esempio di codice combinerà due DataFrame con inner come tipo di join:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(["a", "b", "d", "e", "h"], index=[1, 2, 4, 5, 7], columns=["C1"])
df2 = pd.DataFrame(
    ["AA", "BB", "CC", "EE", "FF"], index=[1, 2, 3, 5, 6], columns=["C2"]
)

df_inner = df1.merge(df2, how="inner", left_index=True, right_index=True)

print(df_inner)

Produzione:

  C1  C2
1  a  AA
2  b  BB
5  e  EE

Il codice seguente unirà i DataFrames con il tipo di join come outer:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(["a", "b", "d", "e", "h"], index=[1, 2, 4, 5, 7], columns=["C1"])
df2 = pd.DataFrame(
    ["AA", "BB", "CC", "EE", "FF"], index=[1, 2, 3, 5, 6], columns=["C2"]
)

df_outer = df1.merge(df2, how="outer", left_index=True, right_index=True)

print(df_outer)

Produzione:

    C1   C2
1    a   AA
2    b   BB
3  NaN   CC
4    d  NaN
5    e   EE
6  NaN   FF
7    h  NaN

Come puoi vedere, il DataFrame unito con tipo di join come inner ha solo record corrispondenti da entrambi i DataFrame, mentre quello con join outer ha tutti gli elementi presenti in essi, riempiendo i record mancanti con NaN. Ora utilizzando la partecipazione a left:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(["a", "b", "d", "e", "h"], index=[1, 2, 4, 5, 7], columns=["C1"])
df2 = pd.DataFrame(
    ["AA", "BB", "CC", "EE", "FF"], index=[1, 2, 3, 5, 6], columns=["C2"]
)

df_left = df1.merge(df2, how="left", left_index=True, right_index=True)

print(df_left)

Produzione:

  C1   C2
1  a   AA
2  b   BB
4  d  NaN
5  e   EE
7  h  NaN

Il DataFrame unito sopra ha tutti gli elementi dal DataFrame sinistro e solo i record corrispondenti dal DataFrame destro. Il suo esatto opposto è il join right, come mostrato di seguito:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(["a", "b", "d", "e", "h"], index=[1, 2, 4, 5, 7], columns=["C1"])
df2 = pd.DataFrame(
    ["AA", "BB", "CC", "EE", "FF"], index=[1, 2, 3, 5, 6], columns=["C2"]
)

df_right = df1.merge(df2, how="right", left_index=True, right_index=True)

print(df_right)

Produzione:

    C1  C2
1    a  AA
2    b  BB
3  NaN  CC
5    e  EE
6  NaN  FF

Usa join() per combinare due Pandas DataFrame sull’indice

Il metodo join() combina i due DataFrame in base ai loro indici e, per impostazione predefinita, il tipo di join è left. Utilizza sempre l’indice del DataFrame destro, ma possiamo menzionare la chiave per il DataFrame sinistro. Possiamo specificare i tipi di join per la funzione join() come abbiamo menzionato per merge().

Il seguente esempio mostra DataFrame unito con tipo di join outer:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(["a", "b", "d", "e", "h"], index=[1, 2, 4, 5, 7], columns=["C1"])
df2 = pd.DataFrame(
    ["AA", "BB", "CC", "EE", "FF"], index=[1, 2, 3, 5, 6], columns=["C2"]
)
df_outer = df1.join(df2, how="outer")
print(df_outer)

Produzione:

    C1   C2
1    a   AA
2    b   BB
3  NaN   CC
4    d  NaN
5    e   EE
6  NaN   FF
7    h  NaN
Autore: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

Articolo correlato - Pandas DataFrame