Diferencia (s) entre merge () y concat () en pandas

85

¿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).

Campanas de viento
fuente
3
Además, relacionado: stackoverflow.com/a/37891437/1972495 una discusión sobre .merge()y .join().
WindChimes
2
Al fusionar, unir y concatizar, encuentro que esta respuesta es muy clara sobre cómo se pueden usar todos para hacer lo mismo (parecen ser solo una interfaz alternativa a la misma funcionalidad). Gracias a tu pregunta (y la respuesta que enlazas en el comentario) sé que finalmente entiendo cómo se relacionan fusionar y unirse. Todavía no me queda claro si concat usa una implementación diferente o no (supongo que tendré que mirar el código fuente ...)
pietroppeter

Respuestas:

77

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, usar left_index=Truey / o right_index=True), y concat()se usa para agregar uno (o más) marcos de datos a uno debajo del otro (o de lado, dependiendo de si la axisopción está configurada en 0 o 1).

join()se utiliza para fusionar 2 marcos de datos sobre la base del índice; en lugar de usar merge()con la opción left_index=Trueque podemos usar join().

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
Abhishek Sawant
fuente
Entonces, ¿esto significa que el argumento howen mergefunciona y significa totalmente diferente de lo que hace en concat?
Hemanth Bakaya
11

pd.concattoma an Iterablecomo argumento. Por tanto, no puede tomar DataFrames directamente como argumento. También los Dimensions de DataFramedeben coincidir a lo largo del eje mientras se concatena.

pd.mergepuede tomar DataFrames como argumento, y se usa para combinar dos DataFrames con las mismas columnas o índice, lo que no se puede hacer pd.concatya que mostrará la columna repetida en el DataFrame.

Mientras que join se puede usar para unir dos DataFrames con índices diferentes.

Piyush Malhotra Nova_Outlaw
fuente
7
Me gusta esta respuesta porque establece que las dimensiones deben coincidir al concatenar. 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. Considerando mergeque en realidad fusionará columnas cuando sean iguales.
jorijnsmit
2
Creo que no es verdad. Incluso la respuesta anterior (por @Abhishek Sawant) da un ejemplo de concatdónde las dimensiones no coinciden.
michcio1234
7

Actualmente estoy tratando de comprender las diferencias esenciales entre pd.DataFrame.merge()y pd.concat().

Buena pregunta. La principal diferencia:

pd.concat trabaja en ambos ejes.

La otra diferencia es que solo pd.concattiene combinaciones internas predeterminadas y externas , mientras que pd.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 para pd.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 la pd.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
prosti
fuente
5

A un nivel alto:

  • .concat()simplemente apila varios DataFramejuntos verticalmente o cose horizontalmente después de alinearlos en el índice
  • .merge()primero alinea dos DataFrame'columnas comunes seleccionadas o índice, y luego toma las columnas restantes de las filas alineadas de cada una DataFrame.

Más específicamente .concat():

  • Es una función de pandas de nivel superior
  • Combina dos o más pandas DataFrame vertical u horizontalmente
  • Se alinea solo en el índice cuando se combina horizontalmente
  • Errores cuando alguno de los DataFramecontiene un índice duplicado.
  • El valor predeterminado es la combinación externa con la opción de combinación interna

Y .merge():

  • Existe tanto como una función de pandas de nivel superior como un DataFramemétodo (a partir de pandas 1.0)
  • Combina exactamente dos DataFramehorizontalmente
  • Alinea la llamada DataFrame's columna (s) o el índice con otra la DataFrame' columna de s (s) o el índice
  • Maneja valores duplicados en las columnas de unión o en el índice realizando un producto cartesiano
  • Por defecto, la combinación interna con opciones para izquierda, externa y derecha

Tenga en cuenta que al realizar la ejecución pd.merge(left, right), si lefttiene dos filas que contienen los mismos valores de las columnas de unión o el índice, cada fila se combinará con rightlas 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 ninguna DataFrame.

Hablando practicamente:

  • Considere .concat()primero cuando combine homogéneos DataFrame, mientras que considere .merge()primero cuando combine complementarios DataFrame.
  • Si necesita fusionarse verticalmente, vaya con .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

Jake Wu
fuente
2

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

  • 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.DataFramenombre pd.Series.

Salida

  • Devoluciones : DataFrame

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])

# 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.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;

nulo
fuente
-2

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)
vicpal
fuente