Tópico 11 – Merge ou Mesclando

Vamos aprender como juntar duas tabelas diferentes de dados.

Resultados Esperados

  1. Uso do merge!

Material Adaptado do DSC10 (UCSD)

#In: 
import numpy as np
import babypandas as bpd
import pandas as pd

Mesclando Dados

#In: 
telefones = bpd.DataFrame().assign(
    Modelo=['iPhone 13', 'iPhone 13 Pro Max', 'Samsung Galaxy Z Flip', 'Pixel 5a'],
    Preco=[799, 1099, 999, 449],
    Tela=[6.1, 6.7, 6.7, 6.3]
)

unidades = bpd.DataFrame().assign(
    Celular=['iPhone 13 Pro Max', 'iPhone 13', 'Pixel 5a', 'iPhone 13'],
    Unidades=[50, 40, 10, 100],
    Shopping=['Del Rey', 'Savassi', 'Diamond', 'Cidade']
)
#In: 
# Preços
telefones
ModeloPrecoTela
0iPhone 137996.1
1iPhone 13 Pro Max10996.7
2Samsung Galaxy Z Flip9996.7
3Pixel 5a4496.3
#In: 
# Unidades por shopping
unidades
CelularUnidadesShopping
0iPhone 13 Pro Max50Del Rey
1iPhone 1340Savassi
2Pixel 5a10Diamond
3iPhone 13100Cidade

Pergunta: Se eu vender todos os telefones do meu estoque, quanto terei em receita?

Se eu vender todos os telefones do meu estoque, quanto terei de receita?

#In: 
telefones.merge(unidades, left_on='Modelo', right_on='Celular')
ModeloPrecoTelaCelularUnidadesShopping
0iPhone 137996.1iPhone 1340Savassi
1iPhone 137996.1iPhone 13100Cidade
2iPhone 13 Pro Max10996.7iPhone 13 Pro Max50Del Rey
3Pixel 5a4496.3Pixel 5a10Diamond

O que acabou de acontecer!? 🤯

#In: 
from IPython.display import display, IFrame

def merging_animation():
    src="https://docs.google.com/presentation/d/e/2PACX-1vSk2FfJ4K_An_CQwcN_Yu5unpJckOZjVQDFqZ78ZTTMmowUsCQKKVnum0_m6TaiGquQ44E3FiS9g2Y4/embed?start=false&loop=false&delayms=60000"
    width=825
    height=500
    display(IFrame(src, width, height))
merging_animation()

.merge

  • Escolha um DataFrame “esquerdo” e “direito”.
  • Escolha uma coluna de cada uma para “mesclar”.
    #In: 
    left_df.merge(
      right_df, 
      left_on=left_column_name,
      right_on=right_column_name
    )
    
  • left_on e right_on devem ser nomes de colunas (não precisam ser iguais).
  • O DataFrame resultante contém uma única linha para cada correspondência entre as duas colunas.
  • As linhas em qualquer DataFrame sem correspondência desaparecem!

Se eu vender todos os telefones do meu estoque, quanto terei de receita?

  • Mostrar no pandas tutor!
#In: 
merge = telefones.merge(
    unidades,
    left_on='Modelo',
    right_on='Celular'
)
#In: 
(merge.get('Preco') * merge.get('Unidades')).sum()
171300

A ordem importa? 🤔

#In: 
unidades.merge(telefones, left_on='Celular', right_on='Modelo')
CelularUnidadesShoppingModeloPrecoTela
0iPhone 13 Pro Max50Del ReyiPhone 13 Pro Max10996.7
1iPhone 1340SavassiiPhone 137996.1
2iPhone 13100CidadeiPhone 137996.1
3Pixel 5a10DiamondPixel 5a4496.3

Resposta: A ordem das linhas e colunas será diferente, mas o conteúdo será o mesmo.

E se quisermos “mesclar” um índice?

Em vez de usar left_on ou right_on, use left_index=True ou right_index=True.

#In: 
telefones
ModeloPrecoTela
0iPhone 137996.1
1iPhone 13 Pro Max10996.7
2Samsung Galaxy Z Flip9996.7
3Pixel 5a4496.3
#In: 
unidades_com_index = unidades.set_index('Celular')
unidades_com_index
UnidadesShopping
Celular
iPhone 13 Pro Max50Del Rey
iPhone 1340Savassi
Pixel 5a10Diamond
iPhone 13100Cidade
#In: 
telefones.merge(
    unidades_com_index,
    left_on='Modelo',
    right_index=True
)
ModeloPrecoTelaUnidadesShopping
0iPhone 137996.140Savassi
0iPhone 137996.1100Cidade
1iPhone 13 Pro Max10996.750Del Rey
3Pixel 5a4496.310Diamond

Configuração de atividade

#In: 
nice_weather_cities = bpd.DataFrame().assign(
    city=['La Jolla', 'San Diego', 'Austin', 'Los Angeles'],
    state=['California', 'California', 'Texas', 'California'],
    today_high_temp=['79', '83', '87', '87']
    
)

schools = bpd.DataFrame().assign(
    name=['UCSD', 'University of Chicago', 'University of San Diego','Johns Hopkins University', 'UT Austin', 'SDSU', 'UCLA'], 
    city=['La Jolla', 'Chicago', 'San Diego', 'Baltimore', 'Austin', 'San Diego', 'Los Angeles'],
    state=['California', 'Illinois', 'California', 'Maryland', 'Texas', 'California', 'California'],
    graduation_rate=[0.87, 0.94, 0.78, 0.92, 0.81, 0.83, 0.91 ]
)

Verificação de conceito ✅

Sem escrever código, quantas linhas existem em nice_weather_cities.merge(schools, on='city')?

  • A. 4
  • B. 5
  • C. 6
  • D. 7
  • E. 8
#In: 
nice_weather_cities
citystatetoday_high_temp
0La JollaCalifornia79
1San DiegoCalifornia83
2AustinTexas87
3Los AngelesCalifornia87
#In: 
schools
namecitystategraduation_rate
0UCSDLa JollaCalifornia0.87
1University of ChicagoChicagoIllinois0.94
2University of San DiegoSan DiegoCalifornia0.78
3Johns Hopkins UniversityBaltimoreMaryland0.92
4UT AustinAustinTexas0.81
5SDSUSan DiegoCalifornia0.83
6UCLALos AngelesCalifornia0.91

Atividade de acompanhamento

Sem escrever código, quantas linhas existem em nice_weather_cities.merge(schools, on='state')?

#In: 
nice_weather_cities.merge(schools, on='state')
city_xstatetoday_high_tempnamecity_ygraduation_rate
0La JollaCalifornia79UCSDLa Jolla0.87
1La JollaCalifornia79University of San DiegoSan Diego0.78
2La JollaCalifornia79SDSUSan Diego0.83
3La JollaCalifornia79UCLALos Angeles0.91
4San DiegoCalifornia83UCSDLa Jolla0.87
.....................
8Los AngelesCalifornia87UCSDLa Jolla0.87
9Los AngelesCalifornia87University of San DiegoSan Diego0.78
10Los AngelesCalifornia87SDSUSan Diego0.83
11Los AngelesCalifornia87UCLALos Angeles0.91
12AustinTexas87UT AustinAustin0.81

13 rows × 6 columns

#In: 
nice_weather_cities.merge(schools, on='state').shape[0]
13

Resumo, da próxima vez

Resumo

  • Para criar grupos dentro de um grupo, passe uma lista para .groupby.
  • O resultado possui uma linha para cada combinação única de elementos nas colunas especificadas.
  • Para combinar informações de vários DataFrames, use .merge.
  • Ao usar .merge, Python procura uma correspondência entre uma coluna especificada em cada DataFrame e combina as linhas com uma correspondência.
  • Se não houver correspondências, a linha desaparece!