Pandas práctico (9): Fusionando Dataframes

Las operaciones de fusión/unión en Pandas te permiten recopilar información de muchas tablas en un solo dataframe para procesamiento o análisis posterior. Esta es otra habilidad importante que probablemente usarás mucho cuando trabajes con datos.

Si tienes algo de experiencia con bases de datos relacionales puedes reconocer el comportamiento análogo con las uniones de tablas. En este artículo, demostraremos algunos de los comportamientos más importantes ofrecidos por la función merge de Pandas. Probablemente será más que suficiente para que puedas seguir adelante antes de que necesites consultar más documentación.

¡Genial, empecemos!

Cargando los datos para los ejemplos

Para las demostraciones, usaremos datos de dos archivos diferentes. Uno de ellos contiene algunos atributos no numéricos de algunos Pokémon, el otro contiene estadísticas base como HP, Ataque y Velocidad.

import pandas as pd

attribs = pd.read_csv('./sample_data/poke_attributes.csv')
attribs
Name Type Color Evolves
0 Abra Psychic Yellow True
1 Ekans Poison Purple True
2 Ditto Normal Pink False
3 Dratini Dragon Blue True
4 Pikachu Electric Yellow True
stats = pd.read_csv('./sample_data/poke_stats.csv')
stats
Name HP Attack Speed
0 Ditto 48 48 48
1 Dratini 41 64 50
2 Pikachu 35 55 90
3 Caterpie 45 30 45
4 Vulpix 38 41 65

Observa que Ditto, Dratini y Pikachu están en ambas tablas, pero Abra y Ekans aparecen solo en la primera mientras que Caterpie y Vulpix aparecen solo en la segunda.

Ahora volvamos a los aspectos de programación: La función merge de Pandas vincula las filas de dos dataframes usando una o más claves. En los siguientes ejemplos, usaremos la columna Name como clave para mostrar diferentes tipos de fusión/unión.

Uniones internas (Inner Joins)

Una unión interna se realiza en la intersección de las claves de los dos dataframes. En este caso, encontrará los Nombres que están en ambos dataframes (Ditto, Dratini y Pikachu) y creará un nuevo dataframe con todas las columnas de ambos dataframes originales.

Llamaremos a la función merge especificando dos argumentos adicionales:

  • how: Le dice a merge qué tipo de unión realizar.
  • on: Le dice a merge qué columnas usar como clave.
innerjoin = pd.merge(attribs, stats, on='Name', how='inner')
innerjoin
Name Type Color Evolves HP Attack Speed
0 Ditto Normal Pink False 48 48 48
1 Dratini Dragon Blue True 41 64 50
2 Pikachu Electric Yellow True 35 55 90

Si quieres realizar una unión interna puedes omitir el atributo how: El comportamiento predeterminado de la función merge es una unión interna:

innerjoin = pd.merge(attribs, stats, on='Name')
innerjoin
Name Type Color Evolves HP Attack Speed
0 Ditto Normal Pink False 48 48 48
1 Dratini Dragon Blue True 41 64 50
2 Pikachu Electric Yellow True 35 55 90

Uniones externas (Outer joins)

Las uniones externas se realizan en la unión de las claves de los dos dataframes. En este caso, usará cada nombre individual en los dataframes originales y rellenará los campos faltantes con NaN.

outerjoin = pd.merge(attribs, stats, on='Name', how='outer')
outerjoin
Name Type Color Evolves HP Attack Speed
0 Abra Psychic Yellow True NaN NaN NaN
1 Ekans Poison Purple True NaN NaN NaN
2 Ditto Normal Pink False 48.0 48.0 48.0
3 Dratini Dragon Blue True 41.0 64.0 50.0
4 Pikachu Electric Yellow True 35.0 55.0 90.0
5 Caterpie NaN NaN NaN 45.0 30.0 45.0
6 Vulpix NaN NaN NaN 38.0 41.0 65.0

Uniones izquierdas (Left joins)

Las uniones izquierdas toman cada elemento del dataframe izquierdo y lo rellenan con las claves en común del dataframe derecho. Esto puede ser un poco más fácil de entender con un ejemplo:

leftjoin = pd.merge(attribs, stats, on='Name', how='left')
leftjoin
Name Type Color Evolves HP Attack Speed
0 Abra Psychic Yellow True NaN NaN NaN
1 Ekans Poison Purple True NaN NaN NaN
2 Ditto Normal Pink False 48.0 48.0 48.0
3 Dratini Dragon Blue True 41.0 64.0 50.0
4 Pikachu Electric Yellow True 35.0 55.0 90.0

Observa cómo Abra y Ekans no tienen valores en HP, Attack y Speed. Esto ocurre porque la tabla derecha no contiene valores para estos Pokémon en particular.

Uniones derechas (Right joins)

Las uniones derechas toman cada elemento del dataframe derecho y lo rellenan con las claves en común del dataframe izquierdo. Esto puede ser un poco más fácil de entender con un ejemplo:

rightjoin = pd.merge(attribs, stats, on='Name', how='right')
rightjoin
Name Type Color Evolves HP Attack Speed
0 Ditto Normal Pink False 48 48 48
1 Dratini Dragon Blue True 41 64 50
2 Pikachu Electric Yellow True 35 55 90
3 Caterpie NaN NaN NaN 45 30 45
4 Vulpix NaN NaN NaN 38 41 65

Observa cómo Caterpie y Vulpix no tienen valores en Type, Color y Evolves. Esto ocurre porque la tabla izquierda no contiene valores para estos Pokémon en particular.

Otras consideraciones

Uniones con columnas clave de diferentes nombres

Si los nombres de las columnas son diferentes, puedes especificarlos con left_on y right_on

pd.merge(leftdataframe, rightdataframe, left_on='left_key', right_on='right_key')

Unir usando índices

Algunas veces quieres usar el índice de los dataframes como columna clave para realizar la unión. Para que esto funcione, solo necesitas pasar dos parámetros adicionales establecidos como verdaderos: left_index=True, right_index=True

Recordando qué tipo de unión necesitas

Si tienes problemas para recordar qué tipo de unión es cuál, echa un vistazo a la siguiente imagen:

Join Types

Datos de múltiples fuentes

En el artículo anterior, comenzamos a hablar sobre la realidad de trabajar con datos reales: Tendrías mucha suerte si encuentras un conjunto de datos limpio en un solo repositorio. En realidad, probablemente necesitarás seleccionar y agregar datos de muchas fuentes diferentes.

Merge es una función relativamente simple a nivel básico, pero es una herramienta increíblemente útil. Acabas de aprender cómo usar lo básico, pero también es una buena idea leer la documentación para tener una idea de las capacidades completas de esta función.

En el próximo artículo, aprenderemos cómo realizar operaciones de grupo en estructuras de datos de Pandas.

¡Gracias por leer!

Qué hacer a continuación

Juan Luis Orozco Villalobos

¡Hola! Soy Juan, ingeniero de software y consultor en Budapest. Me especializo en computación en la nube e IA, y me encanta ayudar a otros a aprender sobre tecnología e ingeniería