Uso de índices jerárquicos en Pandas: Domina df.set_index() y df.unstack()

Publicado el 09 diciembre 2024 por Daniel Rodríguez @analyticslane

Manejar datos tabulares de forma eficiente es una habilidad esencial en la mayoría de los análisis de datos. Sin embargo, las estructuras tradicionales con filas y columnas simples a menudo no son suficientes para capturar algunas relaciones complejas presentes en muchos conjuntos de datos. En estos casos, los índices jerárquicos en Pandas, también conocidos como índices multinivel, se convierten en una herramienta imprescindible. Estos índices permiten organizar y estructurar los datos de manera más flexible, facilitando tareas avanzadas como agrupaciones, creación de tablas pivote y transformaciones complejas.

En esta entrada, se explicará cómo crear y manipular índices jerárquicos utilizando las funciones df.set_index() y de Pandas. Enseñando a resolver problemas comunes, como reorganizar datos para un análisis más detallado o realizar cálculos específicos en diferentes niveles de un índice.

La necesidad de los índices jerárquicos en Pandas

Al trabajar con datos tabulares, generalmente se dispone de columnas que representan características y filas que contienen los registros. Por ejemplo, una tabla que registre las ventas de productos en distintas regiones y fechas podría incluir columnas como Región, Fecha, Producto y Ventas. Esta estructura es suficiente para realizar análisis básicos. Sin embargo, cuando se busca realizar análisis más avanzados, como comparar ventas por región y producto o identificar tendencias temporales, es necesario reorganizar los datos para reflejar relaciones jerárquicas entre ellos.

Sin un índice jerárquico, estos análisis requerirían varios pasos adicionales que pueden llegar a ser complicados e ineficientes. Afortunadamente, Pandas simplifica significativamente estas tareas mediante el uso de índices jerárquicos y funciones como y , que permiten estructurar los datos de manera más flexible y adaptada a diferentes requerimientos.

Uso de índices jerárquicos en Pandas: las funciones df.set_index() y df.unstack()

Antes de aprender a crear índices jerárquicos con df.set_index() y a reorganizarlos con , es importante comprender el concepto y su utilidad en la manipulación de datos complejos.

¿Qué es un índice jerárquico?

Un índice jerárquico, o índice multinivel, es una estructura que organiza los datos en múltiples niveles de índices. Esto permite acceder, analizar y organizar la información de manera más intuitiva y eficiente, especialmente en conjuntos de datos con relaciones complejas. Cada nivel del índice funciona como una dimensión adicional que describe aspectos específicos de los datos, lo que proporciona mayor flexibilidad para realizar fácilmente algunas operaciones avanzadas.

Además de mejorar la organización, los índices jerárquicos también permiten que ciertas operaciones sean más rápidas y expresivas. Por ejemplo, es mucho más sencillo trabajar con datos ya agrupados en niveles jerárquicos que realizar filtrados repetitivos sobre un DataFrame convencional. Simplificando tareas como agrupaciones, filtrados y cálculos específicos dentro de un nivel del índice.

Un índice jerárquico puede estar compuesto por uno o más niveles, donde cada nivel actúa como una capa adicional de información. Estos niveles se dividen en:

  • Índices externos: Representan el nivel más alto de agrupación, como una región geográfica.
  • Índices internos: Proporcionan detalles más específicos dentro de un grupo externo, como fechas o productos individuales dentro de una región.

Esta estructura jerárquica es ideal para trabajar con datos complejos y realizar análisis detallados de forma eficiente.

Crear un índice jerárquico con df.set_index()

La función set_index() permite convertir una o más columnas de un DataFrame en un índice jerárquico. Organizando los datos en múltiples niveles y proporcionando una estructura más flexible para operaciones posteriores. La sintaxis básica de esta función es:

df.set_index(keys, drop=True, inplace=False)
  • keys: Columnas que se usarán como índices.
  • drop: Si es True, elimina las columnas seleccionadas del DataFrame.
  • inplace: Si es True, realiza la operación directamente en el DataFrame original.

Organizar datos con df.unstack()

La función unstack() pivota uno de los niveles del índice jerárquico para convertirlo en columnas. Esto transforma los datos de un formato largo a uno ancho, útil en tablas resumen o análisis comparativo. La sintaxis básica de esta función es:

df.unstack(level=-1)
    level: Nivel del índice que se quiere pivotar. El valor por defecto es el nivel más interno (-1).

Casos prácticos de índices jerárquicos en Pandas

Una vez explicadas las funciones de Pandas para trabajar con índices jerárquicos, es útil explorar algunos casos prácticos en los que estas funciones son particularmente útiles.

Crear un índice jerárquico con set_index()

Para trabajar con índices jerárquicos es necesario contar con un conjunto de datos. Como el conjunto de datos de ventas que se muestra a continuación:

import pandas as pd

# Crear DataFrame
data = {
    'Región': ['Norte', 'Norte', 'Sur', 'Sur'],
    'Fecha': ['2023-01-01', '2023-01-02', '2023-01-01', '2023-01-02'],
    'Producto': ['A', 'B', 'A', 'B'],
    'Ventas': [100, 200, 150, 300]
}

df = pd.DataFrame(data)

print(df)
  Región       Fecha Producto  Ventas
0 Norte 2023-01-01 A 100
1 Norte 2023-01-02 B 200
2 Sur 2023-01-01 A 150
3 Sur 2023-01-02 B 300

Ahora, para analizar las ventas por región y fecha, se puede crear un índice jerárquico:

# Crear índice jerárquico
df_indexed = df.set_index(['Región', 'Fecha'])

print(df_indexed)
                  Producto  Ventas
Región Fecha
Norte 2023-01-01 A 100
2023-01-02 B 200
Sur 2023-01-01 A 150
2023-01-02 B 300

Obteniendo como resultado una tabla jerárquica en la que los datos están organizados por región y fecha. Esta estructura no solo mejora la organización, sino que también facilita realizar diversos análisis de manera más eficiente y clara.

Transformar datos con unstack()

Ahora, supongamos que se desean comparar las ventas por fecha para cada una de las regiones. Para ello se puede usar unstack(), lo que permite crear una tabla pivote con el nivel de Fecha en columnas:

# Pivotar el nivel de Fecha
df_unstacked = df_indexed.unstack(level='Fecha')

print(df_unstacked)
         Producto                Ventas
Fecha 2023-01-01 2023-01-02 2023-01-01 2023-01-02
Región
Norte A B 100 200
Sur A B 150 300

Creando una tabla donde cada columna representa una fecha y cada fila corresponde a una región. Esta disposición permite comparar las ventas de forma clara y directa entre diferentes regiones y periodos.

Combinando índices jerárquicos y operaciones avanzadas

Los índices jerárquicos se pueden utilizar para la realización de cálculos agrupados. Por ejemplo, para calcular el total de ventas por región:

# Calcular total de ventas por región
ventas_por_region = df_indexed.groupby(level='Región')['Ventas'].sum()

print(ventas_por_region)
Región
Norte 300
Sur 450
Name: Ventas, dtype: int64

En este caso, el índice jerárquico facilita las agrupaciones al identificar automáticamente los niveles relevantes.

Conclusiones

El uso de índices jerárquicos en Pandas es una herramienta para organizar y analizar datos complejos. Las funciones y permiten crear estructuras flexibles y realizar transformaciones avanzadas con gran facilidad. Dominar estas técnicas, permite abordar problemas complejos de análisis de datos con menos esfuerzo y una mayor eficiencia.