Fundir Pandas DataFrames no Índice

  1. Utilize merge() para combinar dois DataFrames Pandas no índice
  2. Utilize join() para combinar dois DataFrames Pandas no índice

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

Artigo relacionado - Pandas DataFrame

  • Split Pandas DataFrame
  • Obter Índice de Linhas cuja Coluna Corresponde a Valor Específico em Pandas