HOWTO · Pandas

Fundir Pandas DataFrames no Índice

Este tutorial demonstra como fundir Dataframes no índice com Pandas usando funções merge() e join().

Nesta página

No mundo da Ciência de Dados e Aprendizagem de Máquinas, é essencial ser fluente nas operações de organização, manutenção, e limpeza de dados para uma análise mais aprofundada. A fusão de dois DataFrames é um exemplo de uma dessas operações. Acontece que é fácil combinar dois DataFrames usando a biblioteca Pandas em Python.

Pandas fornece-nos duas funções úteis, merge() e join() para combinar dois DataFrames. Ambos os métodos são muito semelhantes mas o merge() é considerado mais versátil e flexível. Também fornece muitos parâmetros para alterar o comportamento da DataFrame final. O método join() combina os dois DataFrames nos seus índices, enquanto que o método merge() permite-nos especificar as colunas que podem funcionar como chave para fundir dois DataFrames.

Um parâmetro comum de ambas as funções sobre o qual se deve estar familiarizado é how, que define o tipo de junção. Por defeito, o parâmetro how é inner para merge() e left para join(), mas para ambas pode ser alterado para left, right, inner, e outer. É essencial conhecer a diferença entre todas elas.

Ao combinarmos dois DataFrames Pandas, assumimos que um é o DataFrame Esquerdo e o outro é o DataFrame Direito. Tanto o merge() como o join() correspondem aos registos das colunas chave. O inner join devolve um DataFrame de registos que coincidem em ambos os DataFrames. O join outer produz um DataFrame fundido com todos os elementos em ambos os DataFrames, preenchendo NaN para valores em falta em ambos os lados. A união left contém todos os elementos da DataFrame esquerda, mas apenas os registos coincidentes da DataFrame direita. O oposto de left é right, que contém todos os elementos da DataFrame direita e apenas os registos coincidentes da DataFrame esquerda. Tudo isto será mais claro no código de exemplo nas próximas secções onde combinaremos os DataFrames no código abaixo:

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)

Resultado:

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

Utilize merge() para combinar dois DataFrames Pandas no índice

Ao fundir dois DataFrames no índice, o valor dos parâmetros left_index e right_index da função merge() deve ser True. O seguinte exemplo de código combinará dois DataFrames com inner como o tipo de junção:

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)

Resultado:

  C1  C2
1  a  AA
2  b  BB
5  e  EE

O seguinte código irá fundir os DataFrames com o tipo de join como 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)

Resultado:

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

Como pode ver, o DataFrame fundido com o tipo de join como inner só tem registos correspondentes de ambos os DataFrames, enquanto o que tem outer join tem todos os elementos presentes neles, preenchendo os registos em falta com NaN. Agora, usando a junção 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)

Resultado:

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

O DataFrame fundido acima tem todos os elementos da DataFrame esquerda, e apenas os registos correspondentes da DataFrame direita. O seu oposto exacto é a junção right, como se mostra abaixo:

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)

Resultado:

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

Utilize join() para combinar dois DataFrames Pandas no índice

O método join() combina os dois DataFrames com base nos seus índices, e por defeito, o tipo de join é left. Utiliza sempre o índice DataFrame da direita, mas podemos mencionar a chave para DataFrame da esquerda. Podemos especificar os tipos de junção para join() função idêntica à que mencionamos para merge().

O exemplo a seguir mostra DataFrame mesclado com tipo de junção 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)

Resultado:

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