Explicação detalhada da operação de junção do pandas

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

Acho que você gosta

Origin blog.csdn.net/bitcarmanlee/article/details/113311113
Recomendado
Clasificación