Endereço do github do projeto: bitcarmanlee fácil-algoritmo-entrevista-e-prática
muitas vezes traz mensagens privadas aos alunos ou deixa mensagens para fazer perguntas relacionadas, número V bitcarmanlee. Colegas da estrela no github, dentro do escopo de minha habilidade e tempo, farei o possível para ajudá-los a responder a perguntas relacionadas e fazer progressos juntos.
1. Introdução
A operação de junção é uma das operações mais centrais em bancos de dados relacionais. Na prática, os problemas são mais prováveis de ocorrer. O ponto que geralmente precisa ser otimizado também é a operação de junção. Se compararmos o dataframe a uma tabela, a operação de junção estará naturalmente envolvida e é muito, muito comum. Vamos dar uma olhada mais de perto no uso de join em pandas.
2. protótipo do método de junção
A assinatura do método join no código-fonte do pandas é a seguinte
def join(
self, other, on=None, how="left", lsuffix="", rsuffix="", sort=False
) -> "DataFrame":
"""
Join columns of another DataFrame.
Join columns with `other` DataFrame either on index or on a key
column. Efficiently join multiple DataFrame objects by index at once by
passing a list.
Parameters
----------
other : DataFrame, Series, or list of DataFrame
Index should be similar to one of the columns in this one. If a
Series is passed, its name attribute must be set, and that will be
used as the column name in the resulting joined DataFrame.
on : str, list of str, or array-like, optional
Column or index level name(s) in the caller to join on the index
in `other`, otherwise joins index-on-index. If multiple
values given, the `other` DataFrame must have a MultiIndex. Can
pass an array as the join key if it is not already contained in
the calling DataFrame. Like an Excel VLOOKUP operation.
how : {'left', 'right', 'outer', 'inner'}, default 'left'
How to handle the operation of the two objects.
* left: use calling frame's index (or column if on is specified)
* right: use `other`'s index.
* outer: form union of calling frame's index (or column if on is
specified) with `other`'s index, and sort it.
lexicographically.
* inner: form intersection of calling frame's index (or column if
on is specified) with `other`'s index, preserving the order
of the calling's one.
lsuffix : str, default ''
Suffix to use from left frame's overlapping columns.
rsuffix : str, default ''
Suffix to use from right frame's overlapping columns.
sort : bool, default False
Order result DataFrame lexicographically by the join key. If False,
the order of the join key depends on the join type (how keyword).
Returns
-------
DataFrame
A dataframe containing columns from both the caller and `other`.
def join (self, other, on = None, how = "left", lsuffix = "", rsuffix = "", sort = False)
onde
outro: DataFrame, Series ou lista de DataFrame, outro dataframe, série ou dataframe Lista.
on: As colunas que participam da junção, semelhante ao parâmetro on em sql.
como: {'esquerda', 'direita', 'externa', 'interna'}, padrão'esquerda ', semelhante ao método de junção em sql.
lsuffix: o sufixo da coluna duplicada no DataFrame esquerdo rsuffix: o sufixo da coluna duplicada no
DataFrame direito
classificar: classificar lexicograficamente os resultados na chave de junção
3. Junte-se por coluna especificada
Na prática, a maneira mais comum de unir é unir de acordo com uma determinada coluna. Vamos tentar um exemplo simples de junção primeiro
import pandas as pd
def joindemo():
age_df = pd.DataFrame({'name': ['lili', 'lucy', 'tracy', 'mike'],
'age': [18, 28, 24, 36]})
score_df = pd.DataFrame({'name': ['tony', 'mike', 'akuda', 'tracy'],
'score': ['A', 'B', 'C', 'B']})
result = age_df.join(score_df, on='name')
print(result)
O código acima relatará o seguinte erro:
ValueError: You are trying to merge on object and int64 columns. If you wish to proceed you should use pd.concat
O motivo é que a junção será realizada de acordo com o índice do dataframe. Se você não entende, dê uma olhada no código de teste abaixo para entender
def joindemo2():
age_df = pd.DataFrame({'name': ['lili', 'lucy', 'tracy', 'mike'],
'age': [18, 28, 24, 36]})
score_df = pd.DataFrame({'name': ['tony', 'mike', 'akuda', 'tracy'],
'score': ['A', 'B', 'C', 'B']})
print(age_df)
age_df.set_index('name', inplace=True)
print(age_df)
O resultado da execução do código acima é o seguinte
name age
0 lili 18
1 lucy 28
2 tracy 24
3 mike 36
age
name
lili 18
lucy 28
tracy 24
mike 36
O índice padrão do dataframe é um número inteiro aumentando de 0. Os números 0,1,2,3 na frente dele representam o índice. Se especificarmos o índice como o nome, a estrutura do dataframe de saída será alterada e o número que foi incrementado antes desaparecerá.
Se você deseja atingir os requisitos iniciais de adesão, você pode pressionar o seguinte código
def joindemo():
age_df = pd.DataFrame({'name': ['lili', 'lucy', 'tracy', 'mike'],
'age': [18, 28, 24, 36]})
score_df = pd.DataFrame({'name': ['tony', 'mike', 'akuda', 'tracy'],
'score': ['A', 'B', 'C', 'B']})
age_df.set_index('name', inplace=True)
score_df.set_index('name', inplace=True)
result = age_df.join(score_df, on='name')
print(result)
A saída do código é
age score
name
lili 18 NaN
lucy 28 NaN
tracy 24 B
mike 36 B
O padrão é a junção à esquerda, que atende aos requisitos acima.
4. Junte-se de acordo com o índice de aumento automático padrão
Se você deseja ingressar de acordo com o índice de aumento automático padrão, vamos tentar a seguir.
def joindemo():
age_df = pd.DataFrame({'name': ['lili', 'lucy', 'tracy', 'mike'],
'age': [18, 28, 24, 36]})
score_df = pd.DataFrame({'name': ['tony', 'mike', 'akuda', 'tracy'],
'score': ['A', 'B', 'C', 'B']})
result = age_df.join(score_df)
print(result)
O código acima também reportará um erro
ValueError: columns overlap but no suffix specified: Index(['name'], dtype='object')
Neste momento, você precisa dos parâmetros lsuffix, rsuffix
def joindemo():
age_df = pd.DataFrame({'name': ['lili', 'lucy', 'tracy', 'mike'],
'age': [18, 28, 24, 36]})
score_df = pd.DataFrame({'name': ['tony', 'mike', 'akuda', 'tracy'],
'score': ['A', 'B', 'C', 'B']})
result = age_df.join(score_df, lsuffix='_left', rsuffix='_right')
print(result)
name_left age name_right score
0 lili 18 tony A
1 lucy 28 mike B
2 tracy 24 akuda C
3 mike 36 tracy B
5. A diferença com a fusão
Também existe um método de mesclagem nos pandas, que também pode realizar a função de junção. Para suas diferenças específicas, consulte o seguinte link:
https://stackoverflow.com/questions/22676081/what-is-the-difference-between-join-and-merge-in-pandas