La principal diferencia entre merge y concat es que merge le permite realizar una "unión" más estructurada de tablas donde el uso de concat es más amplio y menos estructurado.
Unir
Al hacer referencia a la documentación , se pd.DataFrame.merge
toma a la derecha como un argumento obligatorio, que se puede considerar como unir la tabla izquierda y la tabla derecha de acuerdo con alguna operación de unión estructurada predefinida. Tenga en cuenta la definición de parámetro derecho .
Parámetros requeridos
- derecha : DataFrame o serie con nombre
Parámetros opcionales
- cómo : {'izquierda', 'derecha', 'exterior', 'interior'} predeterminado 'interior'
- en : etiqueta o lista
- left_on : etiqueta o lista, o como una matriz
- right_on : etiqueta o lista, o como una matriz
- left_index : bool, predeterminado Falso
- right_index : bool, predeterminado Falso
- sort : bool, predeterminado False
- sufijos : tupla de (str, str), predeterminado ('_x', '_y')
- copy : bool, predeterminado True
- indicador : bool o str, por defecto Falso
- validar : str, opcional
Importante: pd.DataFrame.merge
requiere derecho a ser un objeto con pd.DataFrame
nombre pd.Series
.
Salida
Además, si verificamos la cadena de documentos para Merge Operation en pandas, se muestra a continuación:
Realizar una operación de combinación de base de datos (SQL) entre dos objetos DataFrame o Series utilizando columnas como claves o sus índices de fila
Concat
Consulte la documentación de pd.concat
, primero tenga en cuenta que el parámetro no se denomina tabla, marco de datos, serie, matriz , etc., sino objs . Es decir, puede pasar muchos "contenedores de datos", que se definen como:
Iterable[FrameOrSeriesUnion], Mapping[Optional[Hashable], FrameOrSeriesUnion]
Parámetros requeridos
- objs : una secuencia o mapeo de objetos Series o DataFrame
Parámetros opcionales
- eje : {0 / 'índice', 1 / 'columnas'}, predeterminado 0
- unirse : {'interno', 'externo'}, predeterminado 'externo'
- ignore_index : bool, predeterminado Falso
- teclas : secuencia, por defecto Ninguna
- niveles : lista de secuencias, predeterminado Ninguno
- nombres : lista, predeterminado Ninguno
- verify_integrity : bool, predeterminado Falso
- sort : bool, predeterminado False
- copy : bool, predeterminado True
Salida
- Devuelve : objeto, tipo de objs
Ejemplo
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)
Salida 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
Sin embargo, puede lograr la primera salida (fusionar) con concat cambiando el parámetro del eje
concat_result = pd.concat([df_left, df_right], sort=False, axis=1)
Observe el siguiente comportamiento,
concat_result = pd.concat([df_left, df_right, df_left, df_right], sort=False)
salidas;
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 no puede realizar una operación similar con la combinación, ya que solo permite un único DataFrame o una serie con nombre.
merge_result = df_left.merge([df_right, df_left, df_right], left_index=True, right_index=True)
salidas;
TypeError: Can only merge Series or DataFrame objects, a <class 'list'> was passed
Conclusión
Como ya habrá notado, las entradas y salidas pueden ser diferentes entre "fusionar" y "concat".
Como mencioné al principio, la primera diferencia (principal) es que "fusionar" realiza una unión más estructurada con un conjunto restringido de objetos y parámetros, mientras que "concat" realiza una unión menos estricta / más amplia con un conjunto más amplio. de objetos y parámetros.
Con todo, la combinación es menos tolerante a los cambios / (la entrada) y "concat" es más flexible / menos sensible a los cambios / (la entrada). Puede lograr "fusionar" utilizando "concat", pero lo contrario no siempre es cierto.
La operación "Fusionar" usa columnas de marco de datos (o el nombre del pd.Series
objeto) o índices de fila, y dado que solo usa esas entidades, realiza una fusión horizontal de marcos de datos o series y no aplica la operación vertical como resultado.
Si quieres ver más, puedes profundizar un poco en el código fuente;
.merge()
y.join()
.