Diferença (s) entre mesclar () e concat () nos pandas

89

Qual (is) a (s) diferença (s) essencial (is) entre pd.DataFrame.merge()e pd.concat()?

Até agora, isso é o que eu encontrei, por favor, comente sobre o quão completo e preciso é o meu entendimento:

  • .merge()só pode usar colunas (mais índices de linha) e é semanticamente adequado para operações no estilo de banco de dados. .concat()pode ser usado com qualquer um dos eixos, usando apenas índices, e oferece a opção de adicionar um índice hierárquico.

  • A propósito, isso permite a seguinte redundância: ambos podem combinar dois dataframes usando os índices de linhas.

  • pd.DataFrame.join() simplesmente oferece uma abreviação para um subconjunto dos casos de uso de .merge()

(O Pandas é ótimo para lidar com um amplo espectro de casos de uso na análise de dados. Pode ser um pouco assustador explorar a documentação para descobrir qual é a melhor maneira de realizar uma tarefa específica.)

Espanta espíritos
fonte
3
Além disso, relacionado: stackoverflow.com/a/37891437/1972495 uma discussão sobre .merge()e .join().
WindChimes
2
Em merge, join e concat, acho que esta resposta é muito clara sobre como todos eles podem ser usados ​​para fazer as mesmas coisas (eles parecem ser apenas uma interface alternativa para a mesma funcionalidade). Graças à sua pergunta (e ao link de resposta no comentário), sei que finalmente entendi como mesclar e juntar estão relacionados. Ainda não está claro para mim se o concat usa uma implementação diferente ou não (acho que terei que olhar o código-fonte ...)
pietroppeter

Respostas:

79

Uma diferença de nível muito alto é que merge()é usado para combinar dois (ou mais) dataframes com base em valores de colunas comuns (índices também podem ser usados, usar left_index=Truee / ou right_index=True), e concat()é usado para anexar um (ou mais) dataframes um abaixo do outro (ou lateralmente, dependendo se oaxis opção está definida como 0 ou 1).

join()é usado para mesclar 2 dataframes com base no índice; em vez de usar merge()com a opção left_index=True, podemos usarjoin() .

Por exemplo:

df1 = pd.DataFrame({'Key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'], 'data1': range(7)})

df1:
   Key  data1
0   b   0
1   b   1
2   a   2
3   c   3
4   a   4
5   a   5
6   b   6

df2 = pd.DataFrame({'Key': ['a', 'b', 'd'], 'data2': range(3)})

df2:
    Key data2
0   a   0
1   b   1
2   d   2

#Merge
# The 2 dataframes are merged on the basis of values in column "Key" as it is 
# a common column in 2 dataframes

pd.merge(df1, df2)

   Key data1 data2
0   b    0    1
1   b    1    1
2   b    6    1
3   a    2    0
4   a    4    0
5   a    5    0

#Concat
# df2 dataframe is appended at the bottom of df1 

pd.concat([df1, df2])

   Key data1 data2
0   b   0     NaN
1   b   1     NaN
2   a   2     NaN
3   c   3     NaN
4   a   4     NaN
5   a   5     NaN
6   b   6     NaN
0   a   Nan   0
1   b   Nan   1
2   d   Nan   2
Abhishek Sawant
fonte
Então, isso significa que o argumento howem mergeobras e média totalmente diferente do que ele faz em concat?
Hemanth Bakaya
11

pd.concatleva um Iterablecomo seu argumento. Conseqüentemente, ele não pode considerar DataFrames diretamente como seu argumento. Além disso, Dimensions do DataFramedeve corresponder ao longo do eixo durante a concatenação.

pd.mergepode ter DataFrames como seu argumento e é usado para combinar dois DataFrames com as mesmas colunas ou índice, o que não pode ser feito pd.concatporque mostrará a coluna repetida no DataFrame.

Enquanto o join pode ser usado para unir dois DataFrames com índices diferentes.

Piyush Malhotra Nova_Outlaw
fonte
7
Eu gosto dessa resposta porque ela afirma que as dimensões devem corresponder ao concatenar. concatnada mais é do que colar vários dataframes uns sobre os outros / lado a lado. Não está ciente do conteúdo, no sentido de que apenas mostrará a mesma coluna duas vezes. Visto que merge, na verdade, mesclará colunas quando forem iguais.
jorijnsmit
3
Eu acho que não é verdade. Mesmo a resposta acima (por @Abhishek Sawant) dá um exemplo de concatonde as dimensões não coincidem.
michcio1234
7

Atualmente, estou tentando compreender a (s) diferença (s) essencial (is) entre pd.DataFrame.merge()e pd.concat().

Boa pergunta. A principal diferença:

pd.concat funciona em ambos os eixos.

A outra diferença é que pd.concattem junções padrão internas e externas apenas, enquanto tem junções padrão esquerda , direita , externa e interna .pd.DataFrame.merge()

A terceira diferença notável é: pd.DataFrame.merge()tem a opção de definir os sufixos da coluna ao mesclar colunas com o mesmo nome, enquanto para pd.concatisso não é possível.


Com, pd.concatpor padrão, você é capaz de empilhar linhas de vários dataframes ( axis=0) e, ao definir o axis=1, você simula a pd.DataFrame.merge()função.

Alguns exemplos úteis de pd.concat:

df2=pd.concat([df]*2, ignore_index=True) #double the rows of a dataframe

df2=pd.concat([df, df.iloc[[0]]]) # add first row to the end

df3=pd.concat([df1,df2], join='inner', ignore_index=True) # concat two df's
Prosti
fonte
6

Em alto nível:

  • .concat() simplesmente empilha múltiplas DataFrame juntos verticalmente ou costura horizontalmente após alinhar no índice
  • .merge()primeiro alinha duas DataFramecolunas ou índices comuns selecionados e, em seguida, pega as colunas restantes das linhas alinhadas de cada uma DataFrame.

Mais especificamente .concat(),:

  • É uma função de pandas de nível superior
  • Combina dois ou mais pandas DataFrame verticalmente ou horizontalmente
  • Alinha apenas no índice ao combinar horizontalmente
  • Erros quando qualquer um dos DataFrame um contém um índice duplicado.
  • O padrão é outer join com a opção de inner join

E .merge():

  • Existe tanto como função de pandas de nível superior quanto como DataFramemétodo (a partir do pandas 1.0)
  • Combina exatamente dois DataFramehorizontalmente
  • Alinha o chamado DataFrame'coluna (s) s ou índice com o outro DataFrame' s coluna (s) ou índice
  • Lida com valores duplicados nas colunas ou índice de junção , executando um produto cartesiano
  • O padrão é união interna com opções para esquerda, externa e direita

Observe que, ao executar pd.merge(left, right), se lefttiver duas linhas contendo os mesmos valores das colunas ou índice que se juntam, cada linha será combinada com righta (s) linha (s) correspondente (s), resultando em um produto cartesiano. Por outro lado, se .concat()for usado para combinar colunas, precisamos ter certeza de que nenhum índice duplicado existe em qualquerDataFrame .

Em termos práticos:

  • Considere .concat()primeiro ao combinar homogêneos DataFrame, enquanto considere .merge()primeiro ao combinar complementares DataFrame.
  • Se precisar mesclar verticalmente, vá com .concat(). Se precisar mesclar horizontalmente por meio de colunas, vá com .merge(), que por padrão se mesclam nas colunas em comum.

Referência: Pandas 1.x Cookbook

Jake Wu
fonte
2

A principal diferença entre mesclar e concat é que a mesclagem permite que você execute uma "junção" mais estruturada de tabelas, onde o uso de concat é mais amplo e menos estruturado.

Unir

Referindo a documentação , pd.DataFrame.mergetem direito como um argumento obrigatório, que você pode pensar que como juntar tabela à esquerda e mesa certa de acordo com alguma operação pré-definida estruturado participar. Observe a definição do parâmetro certo .

Parâmetros Requeridos

  • direita : DataFrame ou série nomeada

Parâmetros Opcionais

  • como : {'esquerda', 'direita', 'externa', 'interna'} padrão 'interna'
  • em : etiqueta ou lista
  • left_on : rótulo ou lista, ou semelhante a matriz
  • pode apostar : rótulo ou lista, ou semelhante a matriz
  • left_index : bool, padrão False
  • right_index : bool, padrão False
  • ordenar : bool, default False
  • sufixos : tupla de (str, str), padrão ('_x', '_y')
  • cópia de : bool, padrão True
  • indicador : bool ou str, padrão False
  • validate : str, opcional

Importante: pd.DataFrame.merge requer o direito de ser um pd.DataFrameou nomeadopd.Series objeto .

Resultado

  • Devoluções : DataFrame

Além disso, se verificarmos a docstring para a operação de mesclagem no pandas está abaixo:

Realize uma operação de mesclagem de banco de dados (SQL) entre dois objetos DataFrame ou Series usando colunas como chaves ou seus índices de linha

Concat

Consulte a documentação de pd.concat, primeiro observe que o parâmetro não é nomeado nenhum de table, data_frame, series, matrix , etc., mas sim objs . Ou seja, você pode passar muitos "contêineres de dados", que são definidos como:

Iterable[FrameOrSeriesUnion], Mapping[Optional[Hashable], FrameOrSeriesUnion]

Parâmetros Requeridos

  • objs : uma sequência ou mapeamento de objetos Series ou DataFrame

Parâmetros Opcionais

  • eixo : {0 / 'índice', 1 / 'colunas'}, padrão 0
  • junção : {'interno', 'externo'}, padrão 'externo'
  • ignore_index : bool, padrão False
  • chaves : sequência, padrão Nenhum
  • níveis : lista de sequências, padrão Nenhum
  • nomes : lista, padrão Nenhum
  • verificar_integridade : bool, padrão False
  • ordenar : bool, default False
  • cópia : bool, padrão True

Resultado

  • Retorna : objeto, tipo de objs

Exemplo

Código

import pandas as pd

v1 = pd.Series([1, 5, 9, 13])
v2 = pd.Series([10, 100, 1000, 10000])
v3 = pd.Series([0, 1, 2, 3])

df_left = pd.DataFrame({
    "v1": v1,
    "v2": v2,
    "v3": v3
    })
df_right = pd.DataFrame({
    "v4": [5, 5, 5, 5],
    "v5": [3, 2, 1, 0]
    })


df_concat = pd.concat([v1, v2, v3])

# Performing operations on default

merge_result = df_left.merge(df_right, left_index=True, right_index=True)
concat_result = pd.concat([df_left, df_right], sort=False)
print(merge_result)
print('='*20)
print(concat_result)

Saída de código

   v1     v2  v3  v4  v5
0   1     10   0   5   3
1   5    100   1   5   2
2   9   1000   2   5   1
3  13  10000   3   5   0
====================
     v1       v2   v3   v4   v5
0   1.0     10.0  0.0  NaN  NaN
1   5.0    100.0  1.0  NaN  NaN
2   9.0   1000.0  2.0  NaN  NaN
3  13.0  10000.0  3.0  NaN  NaN
0   NaN      NaN  NaN  5.0  3.0
1   NaN      NaN  NaN  5.0  2.0
2   NaN      NaN  NaN  5.0  1.0

Você pode obter, no entanto, a primeira saída (mesclar) com concat alterando o parâmetro do eixo

concat_result = pd.concat([df_left, df_right], sort=False, axis=1)

Observe o seguinte comportamento,

concat_result = pd.concat([df_left, df_right, df_left, df_right], sort=False)

saídas;

     v1       v2   v3   v4   v5
0   1.0     10.0  0.0  NaN  NaN
1   5.0    100.0  1.0  NaN  NaN
2   9.0   1000.0  2.0  NaN  NaN
3  13.0  10000.0  3.0  NaN  NaN
0   NaN      NaN  NaN  5.0  3.0
1   NaN      NaN  NaN  5.0  2.0
2   NaN      NaN  NaN  5.0  1.0
3   NaN      NaN  NaN  5.0  0.0
0   1.0     10.0  0.0  NaN  NaN
1   5.0    100.0  1.0  NaN  NaN
2   9.0   1000.0  2.0  NaN  NaN
3  13.0  10000.0  3.0  NaN  NaN
0   NaN      NaN  NaN  5.0  3.0
1   NaN      NaN  NaN  5.0  2.0
2   NaN      NaN  NaN  5.0  1.0
3   NaN      NaN  NaN  5.0  0.0

, que você não pode realizar uma operação semelhante com mesclar, uma vez que permite apenas um único DataFrame ou Série nomeada.

merge_result = df_left.merge([df_right, df_left, df_right], left_index=True, right_index=True)

saídas;

TypeError: Can only merge Series or DataFrame objects, a <class 'list'> was passed

Conclusão

Como você já deve ter notado que a entrada e as saídas podem ser diferentes entre "mesclar" e "concat".

Como mencionei no início, a primeira (principal) diferença é que "mesclar" realiza uma junção mais estruturada com um conjunto restrito de objetos e parâmetros, enquanto "concat" realiza uma junção menos estrita / mais ampla com um conjunto mais amplo de objetos e parâmetros.

Em suma, mesclar é menos tolerante a mudanças / (a ​​entrada) e "concat" é mais flexível / menos sensível a mudanças / (a ​​entrada). Você pode conseguir "mesclar" usando "concat", mas o inverso nem sempre é verdadeiro.

A operação "Mesclar" usa colunas de quadros de dados (ou nome de pd.Seriesobjeto) ou índices de linha e, como usa essas entidades apenas, realiza mesclagem horizontal de quadros de dados ou séries e não aplica a operação vertical como resultado.

Se você quiser ver mais, pode mergulhar um pouco mais fundo no código-fonte;

nulo
fonte
0

Apenas a função concat tem parâmetro de eixo. Merge é usado para combinar dataframes lado a lado com base em valores em colunas compartilhadas para que não haja necessidade de parâmetro de eixo.

Hamid Lotfi
fonte
-2

por padrão:
join é uma junção à esquerda em
colunas pd.merge é uma junção interna em
colunas. pd.concat é uma junção externa em linhas

pd.concat:
aceita argumentos Iteráveis. Assim, ele não pode pegar DataFrames diretamente (use [df, df2]).
Dimensões de DataFrame devem corresponder ao longo do eixo

Join e pd.merge:
podem receber argumentos DataFrame

Clique para ver a imagem para entender por que o código abaixo faz a mesma coisa

df1.join(df2)
pd.merge(df1, df2, left_index=True, right_index=True)
pd.concat([df1, df2], axis=1)
vicpal
fonte