Tópico 11 – Merge ou Mesclando
Vamos aprender como juntar duas tabelas diferentes de dados.
Resultados Esperados
- 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']
)
| Modelo | Preco | Tela |
---|
0 | iPhone 13 | 799 | 6.1 |
---|
1 | iPhone 13 Pro Max | 1099 | 6.7 |
---|
2 | Samsung Galaxy Z Flip | 999 | 6.7 |
---|
3 | Pixel 5a | 449 | 6.3 |
---|
#In:
# Unidades por shopping
unidades
| Celular | Unidades | Shopping |
---|
0 | iPhone 13 Pro Max | 50 | Del Rey |
---|
1 | iPhone 13 | 40 | Savassi |
---|
2 | Pixel 5a | 10 | Diamond |
---|
3 | iPhone 13 | 100 | Cidade |
---|
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')
| Modelo | Preco | Tela | Celular | Unidades | Shopping |
---|
0 | iPhone 13 | 799 | 6.1 | iPhone 13 | 40 | Savassi |
---|
1 | iPhone 13 | 799 | 6.1 | iPhone 13 | 100 | Cidade |
---|
2 | iPhone 13 Pro Max | 1099 | 6.7 | iPhone 13 Pro Max | 50 | Del Rey |
---|
3 | Pixel 5a | 449 | 6.3 | Pixel 5a | 10 | Diamond |
---|
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?
#In:
merge = telefones.merge(
unidades,
left_on='Modelo',
right_on='Celular'
)
#In:
(merge.get('Preco') * merge.get('Unidades')).sum()
A ordem importa? 🤔
#In:
unidades.merge(telefones, left_on='Celular', right_on='Modelo')
| Celular | Unidades | Shopping | Modelo | Preco | Tela |
---|
0 | iPhone 13 Pro Max | 50 | Del Rey | iPhone 13 Pro Max | 1099 | 6.7 |
---|
1 | iPhone 13 | 40 | Savassi | iPhone 13 | 799 | 6.1 |
---|
2 | iPhone 13 | 100 | Cidade | iPhone 13 | 799 | 6.1 |
---|
3 | Pixel 5a | 10 | Diamond | Pixel 5a | 449 | 6.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
.
| Modelo | Preco | Tela |
---|
0 | iPhone 13 | 799 | 6.1 |
---|
1 | iPhone 13 Pro Max | 1099 | 6.7 |
---|
2 | Samsung Galaxy Z Flip | 999 | 6.7 |
---|
3 | Pixel 5a | 449 | 6.3 |
---|
#In:
unidades_com_index = unidades.set_index('Celular')
unidades_com_index
| Unidades | Shopping |
---|
Celular | | |
---|
iPhone 13 Pro Max | 50 | Del Rey |
---|
iPhone 13 | 40 | Savassi |
---|
Pixel 5a | 10 | Diamond |
---|
iPhone 13 | 100 | Cidade |
---|
#In:
telefones.merge(
unidades_com_index,
left_on='Modelo',
right_index=True
)
| Modelo | Preco | Tela | Unidades | Shopping |
---|
0 | iPhone 13 | 799 | 6.1 | 40 | Savassi |
---|
0 | iPhone 13 | 799 | 6.1 | 100 | Cidade |
---|
1 | iPhone 13 Pro Max | 1099 | 6.7 | 50 | Del Rey |
---|
3 | Pixel 5a | 449 | 6.3 | 10 | Diamond |
---|
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')
?
| city | state | today_high_temp |
---|
0 | La Jolla | California | 79 |
---|
1 | San Diego | California | 83 |
---|
2 | Austin | Texas | 87 |
---|
3 | Los Angeles | California | 87 |
---|
| name | city | state | graduation_rate |
---|
0 | UCSD | La Jolla | California | 0.87 |
---|
1 | University of Chicago | Chicago | Illinois | 0.94 |
---|
2 | University of San Diego | San Diego | California | 0.78 |
---|
3 | Johns Hopkins University | Baltimore | Maryland | 0.92 |
---|
4 | UT Austin | Austin | Texas | 0.81 |
---|
5 | SDSU | San Diego | California | 0.83 |
---|
6 | UCLA | Los Angeles | California | 0.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_x | state | today_high_temp | name | city_y | graduation_rate |
---|
0 | La Jolla | California | 79 | UCSD | La Jolla | 0.87 |
---|
1 | La Jolla | California | 79 | University of San Diego | San Diego | 0.78 |
---|
2 | La Jolla | California | 79 | SDSU | San Diego | 0.83 |
---|
3 | La Jolla | California | 79 | UCLA | Los Angeles | 0.91 |
---|
4 | San Diego | California | 83 | UCSD | La Jolla | 0.87 |
---|
... | ... | ... | ... | ... | ... | ... |
---|
8 | Los Angeles | California | 87 | UCSD | La Jolla | 0.87 |
---|
9 | Los Angeles | California | 87 | University of San Diego | San Diego | 0.78 |
---|
10 | Los Angeles | California | 87 | SDSU | San Diego | 0.83 |
---|
11 | Los Angeles | California | 87 | UCLA | Los Angeles | 0.91 |
---|
12 | Austin | Texas | 87 | UT Austin | Austin | 0.81 |
---|
13 rows × 6 columns
#In:
nice_weather_cities.merge(schools, on='state').shape[0]
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!