A tu propio ritmo

Explora nuestra extensa colección de cursos diseñados para ayudarte a dominar varios temas y habilidades. Ya seas un principiante o un aprendiz avanzado, aquí hay algo para todos.

Bootcamp

Aprende en vivo

Únete a nosotros en nuestros talleres gratuitos, webinars y otros eventos para aprender más sobre nuestros programas y comenzar tu camino para convertirte en desarrollador.

Próximos eventos en vivo

Catálogo de contenidos

Para los geeks autodidactas, este es nuestro extenso catálogo de contenido con todos los materiales y tutoriales que hemos desarrollado hasta el día de hoy.

Tiene sentido comenzar a aprender leyendo y viendo videos sobre los fundamentos y cómo funcionan las cosas.

Buscar en lecciones


IngresarEmpezar
← Volver a Cómo hacerlo
  • python

  • pandas

Editar en Github

¿Cómo usar el método merge de Pandas?

Escrito por:

Pandas Merge

El método merge() de Pandas se utiliza para combinar dos o más DataFrames en función de una o más columnas. Veamos como utilizar el método merge() a través del siguiente ejemplo:

1import pandas as pd 2 3# Crear DataFrame de empleados 4df_employees = pd.DataFrame({'Employee_id': [1, 2, 3, 4], 5 'Name': ['Daniel', 'David', 'Carlos', 'Maria']}) 6 7# Crear DataFrame de proyectos 8df_projects = pd.DataFrame({'Project_ID': [55, 88, 100], 9 'Employee_id': [1, 2, 3], 10 'Project': ['Análisis de Datos', 'Desarrollo Web', 'Desarrollo móvil']}) 11 12# Combinar DataFrames usando el método merge() 13df_merged = pd.merge(df_employees, df_projects, on='Employee_id') 14 15print(df_merged)

(output) de la variable df_merged

Employee_idNameProject_IDProject
01Daniel55Análisis de Datos
12David88Desarrollo Web
23Carlos100Desarrollo móvil

En este ejemplo, se crean dos DataFrame, el DataFrame df_employees que incluye información de los empleados y el DataFrame df_projects que contiene información de los proyectos. Se utiliza el método merge() para combinar ambos Dataframes en base a la columna en común Employee_id, esto genera un nuevo DataFrame llamado df_merged que contendrá información de ambos DataFrames, finalmente se imprime por la terminal, donde se puede observar una tabla donde cada fila representa un proyecto y contiene los detalles del empleado asignado a ese proyecto.

Si te interesa aprender más sobre pandas con ejercicios interactivos, te recomendamos nuestro tutorial de pandas para machine learning

Método merge() en Pandas

En Pandas con el método merge() podemos combinar dos o más DataFrames, este método requiere que se le pasen ciertos parámetros para poder realizar la combinación de los DataFrames, estos parámetros son:

1pd.merge( 2 left, 3 right, 4 how='inner', 5 on=None, 6 left_on=None, 7 right_on=None, 8 left_index: False, 9 right_index: False, 10 sort: False, 11 suffixes=('_x', '_y'), 12 copy=True, 13 indicator=False, 14 validate=None)
  • left: Representa el primer DataFrame que se desea combinar (Requerido).

  • right: Representa el segundo DataFrame que se desea combinar (Requerido).

  • how: Representa el tipo de combinación que se desea realizar, puede ser inner, outer, left o right (Opcional). De no especificarse, su valor por defecto es inner. joins

    • inner: Devuelve solo los registros que están en ambos DataFrames.
    • outer: Devuelve todos los registros de ambos DataFrames.
    • left: Devuelve todos los registros del DataFrame de la izquierda y los registros que están en ambos DataFrames.
    • right: Devuelve todos los registros del DataFrame de la derecha y los registros que están en ambos DataFrames.
  • on: Representa el nombre de la columna en común que se utilizará para combinar ambos DataFrames (Opcional).

  • left_on y right_on: Representan el nombre de las columnas en el DataFrame izquierdo y derecho respectivamente, que se utilizarán para combinar ambos DataFrames (Opcional).

  • left_index y right_index: Si se establecen en True, se utiliza el índice del DataFrame izquierdo y derecho respectivamente, para combinar ambos DataFrames (Opcional). De no especificarse sus valores por defecto será False.

  • sort: Si se establece en True se ordenan los registros en base a la columna en común (Opcional). De no especificarse su valor por defecto es False.

  • suffixes: Si se encuentran columnas con el mismo nombre en ambos DataFrames, se le agrega un sufijo a la columna del DataFrame de la izquierda y al DataFrame de la derecha (Opcional). De no especificarse su valor por defecto es ('_x', '_y').

  • copy: Representa si se copia o no la información de los DataFrames (Opcional). De no especificarse su valor por defecto es True.

  • indicator: Si es True se agrega una columna _merge que indica de que DataFrame proviene cada registro (Opcional). De no especificarse su valor por defecto es False.

  • validate: Si se establece como valor one_to_one se valida que la combinación sea de uno a uno, si es one_to_many se valida que la combinación sea de uno a muchos, si es many_to_one se valida que la combinación sea de muchos a uno, si es many_to_many se valida que la combinación sea de muchos a muchos (Opcional).

Ejemplos de uso del método merge() en Pandas

Combinar DataFrames en base a una columna en común

1import pandas as pd 2 3# Crear DataFrame de jugadores mundialistas 4df_world_cup_players = pd.DataFrame([ 5 {"name": "Miroslav Klose", "country": "Germany", "position": "forward"}, 6 {"name": "Ronaldo Nazario", "country": "Brazil", "position": "forward"}, 7 {"name": "Luka Modric", "country": "Croatia", "position": "midfielder"}, 8 {"name": "Erling Haaland", "country": "Norway", "position": "forward"}, 9 {"name": "Lionel Messi", "country": "Argentina", "position": "forward"}, 10 {"name": "Pelé", "country": "Brazil", "position": "forward"}, 11 {"name": "Kylian Mbappé", "country": "France", "position": "forward"}, 12 {"name": "Cristiano Ronaldo", "country": "Portugal", "position": "forward"} 13]) 14 15# Crear DataFrame de máximos goleadores en mundiales 16df_world_top_scorers = pd.DataFrame([ 17 {"name": "Miroslav Klose", "world_cups": 4, "total_matches": 24, "champion": 1, "goals": 16}, 18 {"name": "Ronaldo Nazario", "world_cups": 4, "total_matches": 19, "champion": 2, "goals": 15}, 19 {"name": "Gerd Muller", "world_cups": 2, "total_matches": 13, "champion": 1, "goals": 14}, 20 {"name": "Just Fontaine", "world_cups": 1, "total_matches": 6, "champion": 0, "goals": 13}, 21 {"name": "Lionel Messi", "world_cups": 5, "total_matches": 26, "champion": 1, "goals": 13}, 22 {"name": "Pelé", "world_cups": 4, "total_matches": 14, "champion": 3, "goals": 12}, 23 {"name": "Kylian Mbappé", "world_cups": 2, "total_matches": 14, "champion": 1, "goals": 12}, 24 {"name": "Sándor Kocsis", "world_cups": 1, "total_matches": 5, "champion": 0, "goals": 11}, 25]) 26 27# Combinar DataFrames usando merge() en base al nombre del jugador 28df_merged = pd.merge(df_world_cup_players, df_world_top_scorers, on='name', how="inner") 29 30# Mostrar el DataFrame combinado 31print(df_merged) 32

(output) de la variable df_merged

namecountrypositionworld_cupstotal_matcheschampiongoals
0Miroslav KloseGermanyforward424116
1Ronaldo NazarioBrazilforward419215
2Lionel MessiArgentinaforward526113
3PeléBrazilforward414312
4Kylian MbappéFranceforward214112

En este ejemplo, utilizamos el método merge() para combinar dos DataFrames, df_world_cup_players y df_world_top_scorers, en base a una columna en común, en este caso la columna name, a través del parámetro on. El resultado es un nuevo DataFrame con los registros que se encuentran en ambos DataFrames, debido a que utilizamos el parámetro how="inner". Por lo que se mostrarán solo los jugadores mundialistas que también son máximos goleadores en mundiales.

Combinar DataFrames en base a dos columnas que no tienen el mismo nombre

1import pandas as pd 2 3# Crear DataFrame de jugadores mundialistas 4df_world_cup_players = pd.DataFrame([ 5 {"name": "Miroslav Klose", "country": "Germany", "position": "forward"}, 6 {"name": "Ronaldo Nazario", "country": "Brazil", "position": "forward"}, 7 {"name": "Luka Modric", "country": "Croatia", "position": "midfielder"}, 8 {"name": "Erling Haaland", "country": "Norway", "position": "forward"}, 9 {"name": "Lionel Messi", "country": "Argentina", "position": "forward"}, 10 {"name": "Pelé", "country": "Brazil", "position": "forward"}, 11 {"name": "Kylian Mbappé", "country": "France", "position": "forward"}, 12 {"name": "Cristiano Ronaldo", "country": "Portugal", "position": "forward"} 13]) 14 15# Crear DataFrame de máximos goleadores en mundiales 16df_world_top_scorers = pd.DataFrame([ 17 {"player_name": "Miroslav Klose", "world_cups": 4, "total_matches": 24, "champion": 1, "goals": 16}, 18 {"player_name": "Ronaldo Nazario", "world_cups": 4, "total_matches": 19, "champion": 2, "goals": 15}, 19 {"player_name": "Gerd Muller", "world_cups": 2, "total_matches": 13, "champion": 1, "goals": 14}, 20 {"player_name": "Just Fontaine", "world_cups": 1, "total_matches": 6, "champion": 0, "goals": 13}, 21 {"player_name": "Lionel Messi", "world_cups": 5, "total_matches": 26, "champion": 1, "goals": 13}, 22 {"player_name": "Pelé", "world_cups": 4, "total_matches": 14, "champion": 3, "goals": 12}, 23 {"player_name": "Kylian Mbappé", "world_cups": 2, "total_matches": 14, "champion": 1, "goals": 12}, 24 {"player_name": "Sándor Kocsis", "world_cups": 1, "total_matches": 5, "champion": 0, "goals": 11}, 25]) 26 27df_merged = pd.merge(df_world_cup_players, df_world_top_scorers, left_on='name', right_on="player_name", how="outer") 28 29# Mostrar el DataFrame combinado 30print(df_merged) 31

(output) de la variable df_merged

namecountrypositionplayer_nameworld_cupstotal_matcheschampiongoals
0Miroslav KloseGermanyforwardMiroslav Klose4.024.01.016.0
1Ronaldo NazarioBrazilforwardRonaldo Nazario4.019.02.015.0
2Luka ModricCroatiamidfielderNaNNaNNaNNaNNaN
3Erling HaalandNorwayforwardNaNNaNNaNNaNNaN
4Lionel MessiArgentinaforwardLionel Messi5.026.01.013.0
5PeléBrazilforwardPelé4.014.03.012.0
6Kylian MbappéFranceforwardKylian Mbappé2.014.01.012.0
7Cristiano RonaldoPortugalforwardNaNNaNNaNNaNNaN
8NaNNaNNaNGerd Muller2.013.01.014.0
9NaNNaNNaNJust Fontaine1.06.00.013.0
10NaNNaNNaNSándor Kocsis1.05.00.011.0

En este ejemplo, haciendo uso del método merge(), combinamos los Dataframes df_world_cup_players y df_world_top_scorers en base a las columnas name y player_name respectivamente, a través de los parámetros left_on y right_on. El resultado es un nuevo DataFrame con los registros que se encuentran en ambos DataFrames, debido a que utilizamos el parámetro how="outer". Por lo que se mostrarán todos los jugadores mundialistas y máximos goleadores en mundiales. En caso de que un jugador no se encuentre en ambos DataFrames, se mostrará un NaN en las columnas correspondientes.

Combinar DataFrames en base a los índices

1import pandas as pd 2 3# Crear DataFrame de jugadores mundialistas 4df_world_cup_players = pd.DataFrame([ 5 {"name": "Miroslav Klose", "country": "Germany", "position": "forward"}, 6 {"name": "Ronaldo Nazario", "country": "Brazil", "position": "forward"}, 7 {"name": "Luka Modric", "country": "Croatia", "position": "midfielder"}, 8 {"name": "Erling Haaland", "country": "Norway", "position": "forward"}, 9]) 10 11# Crear DataFrame de estadísticas de jugadores mundialistas 12df_player_stats = pd.DataFrame([ 13 {"matches_played": 24, "goals_scored": 16}, 14 {"matches_played": 19, "goals_scored": 15}, 15 {"matches_played": 26, "goals_scored": 13}, 16 {"matches_played": 14, "goals_scored": 12}, 17]) 18 19# Establecer el nombre de los jugadores como índices en ambos DataFrames 20df_world_cup_players.set_index('name', inplace=True) 21df_player_stats.set_index(df_world_cup_players.index, inplace=True) 22 23# Combinar DataFrames usando merge() en base a los índices 24df_merged = pd.merge(df_world_cup_players,df_player_stats, left_index=True, right_index=True) 25 26# Mostrar el DataFrame combinado 27print(df_merged)

(output) de la variable df_merged

namecountrypositionmatches_playedgoals_scored
Miroslav KloseGermanyforward2416
Ronaldo NazarioBrazilforward1915
Luka ModricCroatiamidfielder2613
Erling HaalandNorwayforward1412

En este ejemplo, haciendo uso del método merge(), combinamos los Dataframes df_world_cup_players y df_player_stats en base a los índices de ambos DataFrames, a través de los parámetros left_index y right_index. El resultado es un nuevo DataFrame con los registros que se encuentran en ambos DataFrames, debido a que la combinación se realiza en base a los índices. Por lo que se mostrarán todos los jugadores mundialistas y sus estadísticas.

Combinar DataFrames con nombres de columnas duplicados

1import pandas as pd 2 3# Crear DataFrame de jugadores mundialistas 4df_world_cup_players = pd.DataFrame([ 5 {"name": "Miroslav Klose", "country": "Germany", "position": "forward"}, 6 {"name": "Ronaldo Nazario", "country": "Brazil", "position": "forward"}, 7 {"name": "Luka Modric", "country": "Croatia", "position": "midfielder"}, 8 {"name": "Erling Haaland", "country": "Norway", "position": "forward"}, 9 {"name": "Lionel Messi", "country": "Argentina", "position": "forward"}, 10 {"name": "Pelé", "country": "Brazil", "position": "forward"}, 11 {"name": "Kylian Mbappé", "country": "France", "position": "forward"}, 12 {"name": "Cristiano Ronaldo", "country": "Portugal", "position": "forward"} 13]) 14 15# Crear DataFrame de máximos goleadores en mundiales 16df_world_top_scorers = pd.DataFrame([ 17 {"name": "Miroslav Klose", "world_cups": 4, "total_matches": 24, "goals": 16, "country": "Germany"}, 18 {"name": "Ronaldo Nazario", "world_cups": 4, "total_matches": 19, "goals": 15, "country": "Brazil"}, 19 {"name": "Gerd Muller", "world_cups": 2, "total_matches": 13, "goals": 14, "country": "Germany"}, 20 {"name": "Just Fontaine", "world_cups": 1, "total_matches": 6, "goals": 13, "country": "France"}, 21 {"name": "Lionel Messi", "world_cups": 5, "total_matches": 26, "goals": 13, "country": "Argentina"}, 22 {"name": "Pelé", "world_cups": 4, "total_matches": 14, "goals": 12, "country": "Brazil"}, 23 {"name": "Kylian Mbappé", "world_cups": 2, "total_matches": 14, "goals": 12, "country": "France"}, 24 {"name": "Sándor Kocsis", "world_cups": 1, "total_matches": 5, "goals": 11, "country": "Hungary"}, 25]) 26 27df_merged = pd.merge(df_world_cup_players, df_world_top_scorers, on='name', how="left", suffixes=('_left', '_right')) 28 29# Mostrar el DataFrame combinado 30print(df_merged)

(output) de la variable df_merged

namecountry_leftpositionworld_cupstotal_matchesgoalscountry_right
0Miroslav KloseGermanyforward4.024.016.0Germany
1Ronaldo NazarioBrazilforward4.019.015.0Brazil
2Luka ModricCroatiamidfielderNaNNaNNaNNaN
3Erling HaalandNorwayforwardNaNNaNNaNNaN
4Lionel MessiArgentinaforward5.026.013.0Argentina
5PeléBrazilforward4.014.012.0Brazil
6Kylian MbappéFranceforward2.014.012.0France
7Cristiano RonaldoPortugalforwardNaNNaNNaNNaN

En este ejemplo, haciendo uso del método merge(), combinamos los Dataframes df_world_cup_players y df_world_top_scorers en base a la columna name de ambos DataFrames. El resultado es un nuevo DataFrame donde se conservarán todos los registros del DataFrame izquierdo debido a que utilizamos el parámetro how="left", y se agregan las columnas del DataFrame derecho. De no existir un registro en el DataFrame derecho, se mostrará un NaN. El parámetro suffixesnos permite agregar un sufijo cuando existen columnas con el mismo nombre en ambos DataFrames y así poder identificar de que DataFrame provienen, por ello observamos que existen columnas con el sufijo\_lefty\_right.

De esta forma también podríamos utilizar el parámetro how="right", para conservar todos los registros del DataFrame derecho y agregar las columnas del DataFrame izquierdo.

La capacidad de combinar DataFrames que nos brinda el método merge() es muy útil, es una herramienta poderosa en el análisis de datos, permitiéndoles por ejemplo a los científicos de datos, realizar análisis más profundos y complejos, obteniendo información simplificada y valiosa para tomar mejores decisiones.

Esperamos que hayas disfrutado de este artículo y que encuentres la información útil para mejorar el análisis de datos con Pandas. Te invitamos a explorar otros recursos en nuestro blog para ampliar tus conocimientos y habilidades con Pandas y la ciencia de datos. Si deseas llevar tu aprendizaje al siguiente nivel, te animamos a registrarte de forma totalmente gratuita en 4Geeks.com.