¿Cuáles son las diferencias esenciales entre pd.DataFrame.merge()y pd.concat()?
Hasta ahora, esto es lo que encontré, comente qué tan completa y precisa es mi comprensión:
.merge()solo puede usar columnas (más índices de fila) y es semánticamente adecuado para operaciones de estilo de base de datos..concat()se puede usar con cualquiera de los ejes, usando solo índices, y ofrece la opción de agregar un índice jerárquico.Por cierto, esto permite la siguiente redundancia: ambos pueden combinar dos marcos de datos utilizando los índices de filas.
pd.DataFrame.join()simplemente ofrece una abreviatura para un subconjunto de los casos de uso de.merge()
(Pandas es excelente para abordar un espectro muy amplio de casos de uso en el análisis de datos. Puede ser un poco abrumador explorar la documentación para averiguar cuál es la mejor manera de realizar una tarea en particular).

.merge()y.join().Respuestas:
Una diferencia de nivel muy alta es que
merge()se usa para combinar dos (o más) marcos de datos sobre la base de valores de columnas comunes (los índices también se pueden usar, usarleft_index=Truey / oright_index=True), yconcat()se usa para agregar uno (o más) marcos de datos a uno debajo del otro (o de lado, dependiendo de si laaxisopción está configurada en 0 o 1).join()se utiliza para fusionar 2 marcos de datos sobre la base del índice; en lugar de usarmerge()con la opciónleft_index=Trueque podemos usarjoin().Por ejemplo:
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 2fuente
howenmergefunciona y significa totalmente diferente de lo que hace enconcat?pd.concattoma anIterablecomo argumento. Por tanto, no puede tomarDataFrames directamente como argumento. También losDimensions deDataFramedeben coincidir a lo largo del eje mientras se concatena.pd.mergepuede tomarDataFrames como argumento, y se usa para combinar dosDataFrames con las mismas columnas o índice, lo que no se puede hacerpd.concatya que mostrará la columna repetida en el DataFrame.Mientras que join se puede usar para unir dos
DataFrames con índices diferentes.fuente
concatno es más que pegar varios marcos de datos uno encima del otro. No es consciente del contenido en el sentido de que solo mostrará la misma columna dos veces. Considerandomergeque en realidad fusionará columnas cuando sean iguales.concatdónde las dimensiones no coinciden.Buena pregunta. La principal diferencia:
pd.concattrabaja en ambos ejes.La otra diferencia es que solo
pd.concattiene combinaciones internas predeterminadas y externas , mientras quepd.DataFrame.merge()tiene combinaciones predeterminadas izquierda , derecha , externa e interna .La tercera otra diferencia notable es:
pd.DataFrame.merge()tiene la opción de establecer los sufijos de columna al fusionar columnas con el mismo nombre, mientras que parapd.concatesto no es posible.De forma
pd.concatpredeterminada, puede apilar filas de múltiples marcos de datos (axis=0) y cuando establece el,axis=1entonces imita lapd.DataFrame.merge()función.Algunos ejemplos útiles 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'sfuente
A un nivel alto:
.concat()simplemente apila variosDataFramejuntos verticalmente o cose horizontalmente después de alinearlos en el índice.merge()primero alinea dosDataFrame'columnas comunes seleccionadas o índice, y luego toma las columnas restantes de las filas alineadas de cada unaDataFrame.Más específicamente
.concat():DataFramevertical u horizontalmenteDataFramecontiene un índice duplicado.Y
.merge():DataFramemétodo (a partir de pandas 1.0)DataFramehorizontalmenteDataFrame's columna (s) o el índice con otra laDataFrame' columna de s (s) o el índiceTenga en cuenta que al realizar la ejecución
pd.merge(left, right), silefttiene dos filas que contienen los mismos valores de las columnas de unión o el índice, cada fila se combinará conrightlas filas correspondientes , lo que dará como resultado un producto cartesiano. Por otro lado, si.concat()se usa para combinar columnas, debemos asegurarnos de que no exista ningún índice duplicado en ningunaDataFrame.Hablando practicamente:
.concat()primero cuando combine homogéneosDataFrame, mientras que considere.merge()primero cuando combine complementariosDataFrame..concat(). Si necesita fusionar horizontalmente a través de columnas, vaya con.merge(), que de forma predeterminada se fusionan en las columnas en común.Referencia: Libro de recetas de Pandas 1.x
fuente
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.mergetoma 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
Parámetros opcionales
Importante:
pd.DataFrame.mergerequiere derecho a ser un objeto conpd.DataFramenombrepd.Series.Salida
Además, si verificamos la cadena de documentos para Merge Operation en pandas, se muestra a continuación:
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
Parámetros opcionales
Salida
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]) # 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)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.0Sin 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 passedConclusió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.Seriesobjeto) 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;
fuente
de forma predeterminada:
join es una combinación izquierda de
columnas pd.merge es una combinación interna de
columnas pd.concat es una combinación externa de filas
pd.concat:
toma argumentos Iterables. Por lo tanto, no puede tomar DataFrames directamente (use [df, df2]). Las
dimensiones de DataFrame deben coincidir a lo largo del eje
Join y pd.merge:
puede tomar argumentos de DataFrame
Haga clic para ver la imagen para comprender por qué el código a continuación hace lo mismo
df1.join(df2) pd.merge(df1, df2, left_index=True, right_index=True) pd.concat([df1, df2], axis=1)fuente