¿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=True
y / 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 laaxis
opció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=True
que 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 2
fuente
how
enmerge
funciona y significa totalmente diferente de lo que hace enconcat
?pd.concat
toma anIterable
como argumento. Por tanto, no puede tomarDataFrame
s directamente como argumento. También losDimension
s deDataFrame
deben coincidir a lo largo del eje mientras se concatena.pd.merge
puede tomarDataFrame
s como argumento, y se usa para combinar dosDataFrame
s con las mismas columnas o índice, lo que no se puede hacerpd.concat
ya que mostrará la columna repetida en el DataFrame.Mientras que join se puede usar para unir dos
DataFrame
s con índices diferentes.fuente
concat
no 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. Considerandomerge
que en realidad fusionará columnas cuando sean iguales.concat
dónde las dimensiones no coinciden.Buena pregunta. La principal diferencia:
pd.concat
trabaja en ambos ejes.La otra diferencia es que solo
pd.concat
tiene 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.concat
esto no es posible.De forma
pd.concat
predeterminada, puede apilar filas de múltiples marcos de datos (axis=0
) y cuando establece el,axis=1
entonces 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's
fuente
A un nivel alto:
.concat()
simplemente apila variosDataFrame
juntos 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()
:DataFrame
vertical u horizontalmenteDataFrame
contiene un índice duplicado.Y
.merge()
:DataFrame
método (a partir de pandas 1.0)DataFrame
horizontalmenteDataFrame
'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)
, sileft
tiene dos filas que contienen los mismos valores de las columnas de unión o el índice, cada fila se combinará conright
las 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.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
Parámetros opcionales
Importante:
pd.DataFrame.merge
requiere derecho a ser un objeto conpd.DataFrame
nombrepd.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.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;
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