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:
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
- Comparte este artículo con amigos y colegas. Gracias por ayudarme a llegar a personas que podrían encontrar útil esta información.
- Puedes encontrar el código fuente para esta serie en este repositorio.
- Este artículo está basado en el libro: Python for Data Analysis.
- Envíame un email con preguntas, comentarios o sugerencias (está en la página Autor)