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.)
.merge()
e.join()
.Respostas:
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, usarleft_index=True
e / ouright_index=True
), econcat()
é 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 usarmerge()
com a opçãoleft_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
fonte
how
emmerge
obras e média totalmente diferente do que ele faz emconcat
?pd.concat
leva umIterable
como seu argumento. Conseqüentemente, ele não pode considerarDataFrame
s diretamente como seu argumento. Além disso,Dimension
s doDataFrame
deve corresponder ao longo do eixo durante a concatenação.pd.merge
pode terDataFrame
s como seu argumento e é usado para combinar doisDataFrame
s com as mesmas colunas ou índice, o que não pode ser feitopd.concat
porque mostrará a coluna repetida no DataFrame.Enquanto o join pode ser usado para unir dois
DataFrame
s com índices diferentes.fonte
concat
nada 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 quemerge
, na verdade, mesclará colunas quando forem iguais.concat
onde as dimensões não coincidem.Boa pergunta. A principal diferença:
pd.concat
funciona em ambos os eixos.A outra diferença é que
pd.concat
tem 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 parapd.concat
isso não é possível.Com,
pd.concat
por padrão, você é capaz de empilhar linhas de vários dataframes (axis=0
) e, ao definir oaxis=1
, você simula apd.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
fonte
Em alto nível:
.concat()
simplesmente empilha múltiplasDataFrame
juntos verticalmente ou costura horizontalmente após alinhar no índice.merge()
primeiro alinha duasDataFrame
colunas ou índices comuns selecionados e, em seguida, pega as colunas restantes das linhas alinhadas de cada umaDataFrame
.Mais especificamente
.concat()
,:DataFrame
verticalmente ou horizontalmenteDataFrame
um contém um índice duplicado.E
.merge()
:DataFrame
método (a partir do pandas 1.0)DataFrame
horizontalmenteDataFrame
'coluna (s) s ou índice com o outroDataFrame
' s coluna (s) ou índiceObserve que, ao executar
pd.merge(left, right)
, seleft
tiver duas linhas contendo os mesmos valores das colunas ou índice que se juntam, cada linha será combinada comright
a (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:
.concat()
primeiro ao combinar homogêneosDataFrame
, enquanto considere.merge()
primeiro ao combinar complementaresDataFrame
..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
fonte
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.merge
tem 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
Parâmetros Opcionais
Importante:
pd.DataFrame.merge
requer o direito de ser umpd.DataFrame
ou nomeadopd.Series
objeto .Resultado
Além disso, se verificarmos a docstring para a operação de mesclagem no pandas está abaixo:
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
Parâmetros Opcionais
Resultado
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.Series
objeto) 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;
fonte
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.
fonte
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)
fonte