Python Pandas - Mesclando / Unindo
O Pandas tem operações de junção na memória com recursos completos e de alto desempenho, de forma idiomática, muito semelhantes a bancos de dados relacionais como SQL.
O Pandas oferece uma única função, merge, como o ponto de entrada para todas as operações de junção de banco de dados padrão entre objetos DataFrame -
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True)
Aqui, usamos os seguintes parâmetros -
left - Um objeto DataFrame.
right - Outro objeto DataFrame.
on- Colunas (nomes) para unir. Deve ser encontrado nos objetos DataFrame esquerdo e direito.
left_on- Colunas do DataFrame esquerdo para usar como chaves. Podem ser nomes de colunas ou matrizes com comprimento igual ao comprimento do DataFrame.
right_on- Colunas do DataFrame certo para usar como chaves. Podem ser nomes de colunas ou matrizes com comprimento igual ao comprimento do DataFrame.
left_index - se True,use o índice (rótulos de linha) do DataFrame esquerdo como sua (s) chave (s) de junção. No caso de um DataFrame com MultiIndex (hierárquico), o número de níveis deve corresponder ao número de chaves de junção do DataFrame correto.
right_index - Mesmo uso que left_index para o DataFrame correto.
how- Um de 'esquerda', 'direita', 'externo', 'interno'. O padrão é interno. Cada método foi descrito abaixo.
sort- Classifique o DataFrame de resultado pelas chaves de junção em ordem lexicográfica. O padrão é True, definir como False melhorará o desempenho substancialmente em muitos casos.
Vamos agora criar dois DataFrames diferentes e realizar as operações de fusão neles.
# import the pandas library
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame(
{'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print left
print right
Está output é o seguinte -
Name id subject_id
0 Alex 1 sub1
1 Amy 2 sub2
2 Allen 3 sub4
3 Alice 4 sub6
4 Ayoung 5 sub5
Name id subject_id
0 Billy 1 sub2
1 Brian 2 sub4
2 Bran 3 sub3
3 Bryce 4 sub6
4 Betty 5 sub5
Mesclar dois DataFrames em uma chave
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left,right,on='id')
Está output é o seguinte -
Name_x id subject_id_x Name_y subject_id_y
0 Alex 1 sub1 Billy sub2
1 Amy 2 sub2 Brian sub4
2 Allen 3 sub4 Bran sub3
3 Alice 4 sub6 Bryce sub6
4 Ayoung 5 sub5 Betty sub5
Mesclar dois DataFrames em várias chaves
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left,right,on=['id','subject_id'])
Está output é o seguinte -
Name_x id subject_id Name_y
0 Alice 4 sub6 Bryce
1 Ayoung 5 sub5 Betty
Mesclar usando o argumento 'como'
o howargumento para mesclar especifica como determinar quais chaves devem ser incluídas na tabela resultante. Se uma combinação de teclas não aparecer nas tabelas da esquerda ou da direita, os valores na tabela associada serão NA.
Aqui está um resumo do how opções e seus nomes equivalentes em SQL -
Método de fusão | SQL equivalente | Descrição |
---|---|---|
esquerda | LEFT OUTER JOIN | Use as chaves do objeto esquerdo |
direito | DIREITO OUTER JOIN | Use as chaves do objeto certo |
exterior | FULL OUTER JOIN | Use a união de chaves |
interior | JUNÇÃO INTERNA | Use a interseção de chaves |
Associação à esquerda
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='left')
Está output é o seguinte -
Name_x id_x subject_id Name_y id_y
0 Alex 1 sub1 NaN NaN
1 Amy 2 sub2 Billy 1.0
2 Allen 3 sub4 Brian 2.0
3 Alice 4 sub6 Bryce 4.0
4 Ayoung 5 sub5 Betty 5.0
Junção certa
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='right')
Está output é o seguinte -
Name_x id_x subject_id Name_y id_y
0 Amy 2.0 sub2 Billy 1
1 Allen 3.0 sub4 Brian 2
2 Alice 4.0 sub6 Bryce 4
3 Ayoung 5.0 sub5 Betty 5
4 NaN NaN sub3 Bran 3
Junção Externa
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, how='outer', on='subject_id')
Está output é o seguinte -
Name_x id_x subject_id Name_y id_y
0 Alex 1.0 sub1 NaN NaN
1 Amy 2.0 sub2 Billy 1.0
2 Allen 3.0 sub4 Brian 2.0
3 Alice 4.0 sub6 Bryce 4.0
4 Ayoung 5.0 sub5 Betty 5.0
5 NaN NaN sub3 Bran 3.0
Junção interna
A adesão será realizada no índice. A operação de junção honra o objeto no qual é chamada. Então,a.join(b) não é igual a b.join(a).
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='inner')
Está output é o seguinte -
Name_x id_x subject_id Name_y id_y
0 Amy 2 sub2 Billy 1
1 Allen 3 sub4 Brian 2
2 Alice 4 sub6 Bryce 4
3 Ayoung 5 sub5 Betty 5