Skip to main content

Command Palette

Search for a command to run...

Aula 10.3 - Análise e visualização de dados em Python - biblioteca pandas (parte 8)

Apenas mais uma função no pandas, e podemos dar essa jornada de juntar dados como encerrada. Ao menos por enquanto…

Updated
7 min read
Aula 10.3 - Análise e visualização de dados em Python - biblioteca pandas (parte 8)

Nas últimas aulas desta série, vimos o poder do pandas para fazer junções de diferentes fontes de dados, facilitando assim a vida de quem tem precisado lidar com tabelas fragmentadas. Até o momento, discutimos com mais detalhes as funções concat() e merge(); falta-nos agora a apresentação da última função, join().

O nome já diz: a função join()

Quando você vê o nome da função, join(), é possível que pense outra vez na cláusula JOIN do SQL. E a verdade é… que é por aí mesmo. Veja a tabela abaixo; a função do pandas nada mais é que uma “tradução” das funções de JOIN para uma forma a ser utilizada através de uma biblioteca Python.

pandas join()SQL JOINOperação
how='inner'INNER JOINRetorna apenas registros que correspondem em ambas as fontes
how='left'LEFT JOINRetorna todos os registros da fonte esquerda + correspondências da direita
how='right'RIGHT JOINRetorna todos os registros da fonte direita + correspondências da esquerda
how='outer'FULL OUTER JOINRetorna todos os registros de ambas as fontes

Agora, se você está conosco há algum tempo e se lembra das aulas anteriores, essas informações vão parecer um tanto familiares. E são familiares mesmo! Perceba que as características batem com uma outra função do pandas, merge().

Mas é tudo igual mesmo? Comparando join() com merge()

É possível que você pense que a função join()seja uma mera redundância do merge(), e que a escolha de qual recurso utilizar é indiferente quando se quer fazer uma combinação de DataFrames. No entanto, as coisas não precisam ser (e não são, na verdade) assim. Dê uma olhada na tabela abaixo; aqui você verá duas coisas: apontamentos sobre as diferenças entre as funções do pandas e a equivalência com a cláusula do SQL.

Característicapandas join()pandas merge()SQL JOIN
Uso PrincipalCombinar DataFrames baseado em índicesCombinar DataFrames baseado em colunasCombinar tabelas baseado em colunas
Sintaxe Básicadf1.join(df2)df1.merge(df2, on='coluna')SELECT * FROM t1 JOIN t2 ON t1.col = t2.col
Base da JunçãoÍndices por padrão, pode usar colunas com onColunas específicas usando on, left_on, right_onColunas específicas usando cláusula ON
Tipos de Join- how='left'
- how='right'
- how='inner'
- how='outer'
- how='left'
- how='right'
- how='inner'
- how='outer'
- how='cross'
- LEFT JOIN
- RIGHT JOIN
- INNER JOIN
- FULL OUTER JOIN
- CROSS JOIN
Tratamento de Colunas DuplicadasUsa lsuffix e rsuffixUsa suffixesRequer aliases explícitos na consulta
Melhor Para- Junções simples baseadas em índice
- Dados já indexados corretamente
- Operações mais diretas
- Junções complexas
- Múltiplas colunas de junção
- Maior flexibilidade
- Junções complexas
- Múltiplas condições
- Operações em banco de dados
Limitações- Menos flexível para junções complexas
- Primariamente focado em índices
- Sintaxe mais verbosa
- Pode ser complexo para junções simples
- Requer conhecimento de SQL
- Menos integrado com análise de dados em Python
PerformanceMelhor para junções baseadas em índiceMelhor para junções complexas de DataFramesOtimizado para operações em banco de dados

Desta tabela, uma coisa fica clara: enquanto merge() dá a possibilidade de combinar DataFrames baseados em colunas, a concentração de join() se dá nos índices do DataFrame. Para lembrar o que são índices para o pandas:

The index of a DataFrame is a series of labels that identify each row. The labels can be integers, strings, or any other hashable type. The index is used for label-based access and alignment, and can be accessed or modified using this attribute.

Traduzindo, é algo assim:

O índice de um DataFrame é uma série de etiquetas (labels) que identificam cada linha. Podem ser números inteiros, strings, ou qualquer tipo de dado que possa ser utilizada como chave. É utilizado para acesso e alinhamento de dados baseando-se em etiquetas, podendo acessar e modificar linhas usando esse mesmo atributo.

Então, em vez de nos orientarmos pelos nomes das colunas, como em merge(), podemos nos valer de, digamos, os “nomes” das linhas usando o join().

Um exemplo prático

Comecemos o exemplo criando dois DataFrames de características envolvendo aspectos corpóreos de um grupo limitado de aves. Nesse caso, como usaremos o join(), daremos uma atenção especial aos índices de cada DataFrame. Cada linha das tabelas possuirá um nome científico de uma ave em específico.

import pandas as pd
import numpy as np

# Criando DataFrame com dados das asas
df_asas = pd.DataFrame({
    'envergadura_cm': [240, 180, 85, 120, 300],
    'comp_dedo_medio_cm': [12, 8, 4, 6, 15],
    'comp_asa_cm': [110, 85, 40, 55, 145]
}, index=['Aquila chrysaetos',  # Águia-real
          'Buteo buteo',        # Águia-de-asa-redonda
          'Falco tinnunculus',  # Peneireiro-vulgar
          'Accipiter nisus',    # Gavião-da-europa
          'Gyps fulvus'])       # Grifo

# Criando DataFrame com dados das pernas
df_pernas = pd.DataFrame({
    'comp_tarso_cm': [9.5, 7.2, 4.5, 5.8, 10.2],
    'comp_total_perna_cm': [35, 28, 18, 22, 40],
    'circunf_tarso_cm': [8, 6, 3, 4, 9]
}, index=['Aquila chrysaetos',    # Águia-real
          'Buteo buteo',          # Águia-de-asa-redonda
          'Falco tinnunculus',    # Peneireiro-vulgar
          'Strix aluco',          # Coruja-do-mato
          'Gyps fulvus'])         # Grifo

Perceba já de início que existem alguns índices que possuem nomes iguais (que é o intuito dessa atividade); esta parte é muito importante para usar o join(). A partir daqui, então, já podemos “traduzir” as cláusulas do SQL para argumentos da função, assim como fizemos com o merge() anteriormente, como no bloco de código abaixo:

# Exemplo 1: Inner join (apenas espécies que aparecem em ambos os DataFrames)
df_inner = df_asas.join(df_pernas, how='inner')

# Exemplo 2: Left join (todas as espécies do DataFrame de asas)
df_left = df_asas.join(df_pernas, how='left')

# Exemplo 3: Right join (todas as espécies do DataFrame de pernas)
df_right = df_asas.join(df_pernas, how='right')

# Exemplo 4: Outer join (todas as espécies de ambos os DataFrames)
df_outer = df_asas.join(df_pernas, how='outer')

Como resultado, teremos para cada variável criada um DataFrame com os dados de asas e pernas de aves conforme o tipo de JOIN selecionado. Note que existem espécies que ocorrem em apenas uma das tabelas. Isso não vem a atrapalhar a mescla como um todo, mas é importante salientar que, no caso das colunas referentes ao outro DataFrame (onde a espécie não está descrita), os dados virão nulos.

O resumo da ópera

Chegando ao final das discussões sobre as diferentes formas de mesclar DataFrames usando pandas, podemos resumir tudo em uma tabela como esta abaixo, estabelecendo também comparações com a cláusula JOIN do SQL:

Comparação entre métodos de junção pandas e SQL

Comparação entre métodos de junção pandas e SQL

Característicapandas join()pandas merge()pandas concat()SQL JOIN
Uso PrincipalCombinar DataFrames baseado em índicesCombinar DataFrames baseado em colunasEmpilhar DataFrames (vertical ou horizontal)Combinar tabelas baseado em colunas
Sintaxe Básicadf1.join(df2)df1.merge(df2, on='coluna')pd.concat([df1, df2])SELECT * FROM t1 JOIN t2 ON t1.col = t2.col
Base da JunçãoÍndices por padrão, pode usar colunas com onColunas específicas usando on, left_on, right_onPosição (eixo) dos DataFramesColunas específicas usando cláusula ON
Tipos de Operação- how='left'
- how='right'
- how='inner'
- how='outer'
- how='left'
- how='right'
- how='inner'
- how='outer'
- how='cross'
- axis=0 (vertical)
- axis=1 (horizontal)
- join='outer'
- join='inner'
- LEFT JOIN
- RIGHT JOIN
- INNER JOIN
- FULL OUTER JOIN
- CROSS JOIN
Tratamento de DuplicatasUsa lsuffix e rsuffixUsa suffixesUsa ignore_index e keysRequer aliases explícitos na consulta
Melhor Para- Junções simples baseadas em índice
- Dados já indexados corretamente
- Operações mais diretas
- Junções complexas
- Múltiplas colunas de junção
- Maior flexibilidade
- Combinar DataFrames sequencialmente
- Empilhar dados vertical/horizontalmente
- Manter índices originais
- Junções complexas
- Múltiplas condições
- Operações em banco de dados
Limitações- Menos flexível para junções complexas
- Primariamente focado em índices
- Sintaxe mais verbosa
- Pode ser complexo para junções simples
- Não faz junção baseada em valores
- Limitado a operações de empilhamento
- Requer conhecimento de SQL
- Menos integrado com análise em Python
PerformanceMelhor para junções baseadas em índiceMelhor para junções complexas de DataFramesEficiente para empilhamento simplesOtimizado para operações em banco de dados
Exemplo de Uso ComumCombinar dados financeiros usando datas como índiceCombinar dados de vendas usando ID do clienteCombinar relatórios mensais sequencialmenteCombinar dados de diferentes tabelas relacionais

Esta é, portanto, a última aula que explora as três funções que podemos usar para juntar tabelas usando o pandas: concat(), join(), e merge(). Continuaremos a explorar outros atributos do pandas e do Python para analisar dados, especialmente os dados ecológicos, nas próximas aulas a serem publicadas em breve.

Aproveite o conteúdo para seguir estudando! Um abraço e até a próxima!


Para ler mais:

Python para Ecólogos (e outros biólogos também)

Part 1 of 14

Se a programação é o novo inglês, e os dados são o novo petróleo, a Biologia e a Ecologia tem muito a se beneficiar nisso. Inspirada em "Data Analysis and Visualization in Python for Ecologists".

Up next

Aula 10.2 - Análise e visualização de dados em Python - biblioteca pandas (parte 7)

Se duas cabeças juntas pensam melhor que uma, o que dizer de dois conjuntos de dados?