# Como unir DataFrames com Pandas merge() em Python

A função Pandas `DataFrame.merge()` é utilizada para unir dois DataFrames com base em chaves (keys) comuns. Desta forma, pode combinar dados de diferentes fontes de maneira eficiente para realizar análises mais completas.

## Sintaxe da função Pandas `merge()`

A função Pandas `DataFrame.merge()` da Biblioteca Python Pandas aceita uma ampla variedade de parâmetros que afetam a forma como os DataFrames são combinados. A sintaxe geral da função `merge()` é a seguinte:

```python
DataFrame.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
```

Nota A função `merge()` do Pandas é semelhante à operação JOIN em bases de dados relacionais. Se já estiver familiarizado com linguagens de bases de dados como [SQL](https://www.ionos.com/pt-pt/digitalguide/servidores/know-how/o-que-e-sql/), será mais fácil compreender a função Pandas`merge()`. No entanto, é importante referir que o comportamento difere em alguns aspetos: se ambas as colunas-chave contiverem valores avaliados como *nulos*, estes também serão combinados.

### Parâmetros relevantes

Com os diferentes parâmetros aceites pela função Pandas `merge()`, não só especifica os [DataFrames](https://www.ionos.com/pt-pt/digitalguide/paginas-web/desenvolvimento-web/dataframes-do-pandas-python/) que deseja combinar, mas também o tipo de união (também chamado de join em inglês) e outros detalhes adicionais.

<table>
  <thead>
    <tr>
      <th>Parâmetro</th>
      <th>Descrição</th>
      <th>Valor predefinido</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`left`</td>
      <td>Primeiro DataFrame a ser combinado</td>
      <td></td>
    </tr>
    <tr>
      <td>`right`</td>
      <td>Segundo DataFrame a ser combinado</td>
      <td></td>
    </tr>
    <tr>
      <td>`how`</td>
      <td>Tipo de união a ser realizada (`inner`, `outer`, `left` ou `right`)</td>
      <td>`inner`</td>
    </tr>
    <tr>
      <td>`on`</td>
      <td>Coluna ou nível de índice utilizado como chave; deve estar presente em ambos os DataFrames</td>
      <td></td>
    </tr>
    <tr>
      <td>`left_on`</td>
      <td>Coluna ou nível de índice do DataFrame esquerdo utilizado como chave</td>
      <td></td>
    </tr>
    <tr>
      <td>`right_on`</td>
      <td>Coluna ou nível de índice do DataFrame direito usado como chave</td>
      <td></td>
    </tr>
    <tr>
      <td>`left_index`</td>
      <td>Se for `True`, o índice do DataFrame esquerdo é usado como chave</td>
      <td>`False`</td>
    </tr>
    <tr>
      <td>`right_index`</td>
      <td>Se for `True`, o índice do DataFrame direito é usado como chave</td>
      <td>`False`</td>
    </tr>
    <tr>
      <td>`sort`</td>
      <td>Se for `True`, as chaves resultantes do DataFrame são ordenadas de forma lexicográfica</td>
      <td>`False`</td>
    </tr>
    <tr>
      <td>`suffixes`</td>
      <td>Sufixos utilizados para tornar únicas as colunas com nomes duplicados</td>
      <td>`("_x", "_y")`</td>
    </tr>
    <tr>
      <td>`copy`</td>
      <td>Se for `False`, não é feita uma cópia</td>
      <td>`True`</td>
    </tr>
  </tbody>
</table>

## Como utilizar o Pandas `merge()`

Apresentamos uma série de exemplos que o ajudarão a compreender como funciona o Pandas `merge()`.

### `INNER JOIN` ou união interna

Um INNER JOIN ou junção interna une dois DataFrames do Pandas e **retorna apenas as linhas em que as chaves coincidem em ambos os DataFrames**. Primeiro, criaremos dois DataFrames que servirão de exemplo:

```python
import pandas as pd
# DataFrames de ejemplo
df1 = pd.DataFrame({
    'Clave': ['A', 'B', 'C'],
    'Valor1': [1, 2, 3]
})
df2 = pd.DataFrame({
    'Clave': ['B', 'C', 'D'],
    'Valor2': [4, 5, 6]
})
print(df1)
print(df2)
```

Os dois DataFrames resultantes teriam a seguinte aparência:

```none
Clave    Valor1
0        A             1
1        B             2
2        C             3
    Clave    Valor2
0        B             4
1        C             5
2        D             6
```

Agora pode realizar um `INNER JOIN` utilizando a função die `merge()`:

```python
# INNER JOIN
result = pd.merge(df1, df2, how='inner', on='Clave')
print(result)
```

A saída mostra que, neste exemplo, apenas as linhas com as chaves B e C são incluídas no DataFrame resultante, uma vez que estas estão presentes em **ambos os DataFrames originais**.

```none
Clave    Valor1    Valor2
0        B            2            4
1        C            3            5
```

### `OUTER JOIN` ou união externa

Uma `OUTER JOIN` ou junção externa também une dois DataFrames. Ao contrário da junção interna (`INNER JOIN`), com a junção externa todas as linhas são devolvidas e os **valores em falta são preenchidos com `NaN`**.

```python
# OUTER JOIN
result = pd.merge(df1, df2, how='outer', on='Clave')
print(result)
```

Como era de se esperar, o DataFrame resultante inclui **todas as linhas de ambos os DataFrames**. Para a chave A, que só está presente em `df1`, e a chave D, que só está presente em `df2`, os valores ausentes são preenchidos com `NaN`.

```none
Clave    Valor1    Valor2
0        A        1.0        NaN
1        B        2.0        4.0
2        C        3.0        5.0
3        D        NaN        6.0
```

Nota As restantes variantes de `JOIN` que incluímos na tabela anterior funcionam de forma análoga.

### Utilização de `left_on` e `right_on`

Às vezes, os dois DataFrames têm nomes de colunas-chave diferentes. Nesse caso, pode usar os parâmetros `left_on` e `right_on` para especificar quais colunas devem ser utilizadas. Para isso, primeiro deve criar dois novos DataFrames:

```python
df3 = pd.DataFrame({
    'Clave': ['A', 'B', 'C'],
    'Valor1': [1, 2, 3]
})
df4 = pd.DataFrame({
    'Clave2': ['B', 'C', 'D'],
    'Valor2': [4, 5, 6]
})
print(df3)
print(df4)
```

Os dois DataFrames resultantes têm a seguinte aparência:

```none
Clave    Valor1
0        A            1
1        B            2
2        C            3
    Clave2    Valor2
0        B            4
1        C            5
2        D            6
```

Para realizar a operação `JOIN` com chaves diferentes, especificam-se os parâmetros `left_on` e `right_on`:

```python
# Unir con diferentes nombres de columnas clave
result = pd.merge(df3, df4, how='inner', left_on='Clave', right_on='Clave2')
print(result)
```

Ao utilizar explicitamente `left_on='Clave'` e `right_on='Clave2'`, as colunas-chave correspondentes são utilizadas para realizar a junção.

```none
Clave  Valor1 Clave2 Valor2
0     B        2        B        4
1     C        3        C        5
```

### Utilização de índices como chave

Também pode utilizar os **índices dos DataFrames como chave para a junção**, configurando os parâmetros `left_index` e `right_index` em `True`. Primeiro, são criados dois novos DataFrames com índices:

```python
df5 = pd.DataFrame({
    'Valor1': [1, 2, 3]
}, index=['A', 'B', 'C'])
df6 = pd.DataFrame({
    'Valor2': [4, 5, 6]
}, index=['B', 'C', 'D'])
print(df5)
print(df6)
```

Com o código anterior, são gerados os seguintes DataFrames:

```none
Valor1
A        1
B        2
C        3
    Valor2
B        4
C        5
D        6
```

Agora é possível realizar uma operação de junção baseada em índices com Pandas merge():

```python
# Unir con índices
result = pd.merge(df5, df6, how='inner', left_index=True, right_index=True)
print(result)
```

O resultado, como era de se esperar, é uma união ou `JOIN` baseada nos índices dos DataFrames:

```none
Valor1  Valor2
B        2        4
C        3        5
```


This is a markdown version of: [https://www.ionos.com/pt-pt/digitalguide/paginas-web/desenvolvimento-web/pandas-dataframe-merge-em-python/](https://www.ionos.com/pt-pt/digitalguide/paginas-web/desenvolvimento-web/pandas-dataframe-merge-em-python/) for AI/LLM consumption.