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
- 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.DataFrame
ou nomeadopd.Series
objeto .
Resultado
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])
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;
.merge()
e.join()
.