Cómo crear una tabla dinámica con pandas en Python
Una tabla dinámica resume decenas o miles de registros en una cuadrícula fácil de leer, cruzando dos dimensiones y agregando los valores en cada intersección. En Python, la biblioteca pandas hace exactamente esto con una única función, pivot_table. Si ya has usado tablas dinámicas en Excel, reconocerás la idea, solo que ahora vive en código, reproducible y fácil de automatizar. Es una de las habilidades más útiles en el día a día de quien trabaja con datos.
Requisitos previos
- Python 3.9 o superior instalado.
- La biblioteca pandas instalada (
pip install pandas). - Nociones básicas de un DataFrame: filas, columnas y tipos de datos.
- Un editor de código o Jupyter Notebook para ejecutar los ejemplos.
Paso 1: Preparar los datos
Partiremos de un DataFrame de ejemplo con ventas. Cada fila representa una venta y tiene cuatro columnas: la región, el producto, el mes y el valor. En un proyecto real estos datos vendrían de un archivo CSV o de una base de datos; para aprender el concepto, basta con crearlos a mano.
import pandas as pd
vendas = pd.DataFrame({
"regiao": ["Norte", "Norte", "Sul", "Sul", "Centro", "Norte"],
"produto": ["A", "B", "A", "B", "A", "A"],
"mes": ["Jan", "Jan", "Jan", "Fev", "Fev", "Fev"],
"valor": [100, 150, 90, 200, 120, 130],
})
print(vendas)
Paso 2: Crear la primera tabla dinámica
Con los datos listos, llamamos a pivot_table. Hay tres parámetros esenciales: index define lo que aparece en las filas, columns define lo que aparece en las columnas y values indica la columna numérica que se va a agregar. Vamos a sumar las ventas por región (filas) y por producto (columnas).
tabela = vendas.pivot_table(
values="valor",
index="regiao",
columns="produto",
aggfunc="sum",
)
print(tabela)
El resultado es una cuadrícula en la que cada celda muestra el total de ventas de un producto en una región. Fíjate cómo pasamos de una lista larga de ventas a un resumen con pocas filas: ese es el poder de una tabla dinámica.
Paso 3: Elegir la función de agregación
El parámetro aggfunc decide cómo se combinan los valores de cada grupo. Si no lo indicas, pandas calcula la media (mean) de forma predeterminada, lo que suele sorprender a quien espera una suma. Puedes usar "sum", "mean", "count", "min" o "max", según la pregunta que quieras responder.
media = vendas.pivot_table(
values="valor",
index="regiao",
columns="produto",
aggfunc="mean",
)
print(media)
Consejo: define siempre aggfunc de forma explícita. Una suma responde a "cuánto vendimos en total"; una media responde a "cuál es el valor típico de cada venta".
Paso 4: Rellenar vacíos y mostrar totales
Cuando una combinación no existe en los datos — la región Centro no vendió el producto B — la celda muestra NaN. El parámetro fill_value=0 sustituye esos vacíos por cero, haciendo la tabla más legible. Con margins=True, pandas añade además una fila y una columna de totales, que aquí llamamos Total. Así ves de inmediato el rendimiento de cada región y de cada producto.
tabela = vendas.pivot_table(
values="valor",
index="regiao",
columns="produto",
aggfunc="sum",
fill_value=0,
margins=True,
margins_name="Total",
)
print(tabela)
Paso 5: Cruzar más de una dimensión
Una tabla dinámica no se limita a una dimensión por eje. Si pasas una lista a index, creas niveles jerárquicos: primero la región y, dentro de cada región, el mes. Los productos permanecen en las columnas.
detalhe = vendas.pivot_table(
values="valor",
index=["regiao", "mes"],
columns="produto",
aggfunc="sum",
fill_value=0,
)
print(detalhe)
Este formato es excelente para informes, porque permite navegar de lo general al detalle sin escribir bucles ni consultas complejas.
Verificar el resultado
Ejecuta el script completo. En la tabla del Paso 4 deberías ver las tres regiones en las filas, los productos A y B en las columnas, y una fila y una columna llamadas Total. Para confirmar que todo está bien, suma la columna valor del DataFrame original: da 790. Ese valor debe coincidir con la celda de la esquina inferior derecha de la tabla (el total general). Si coincide, tu tabla dinámica es correcta.
Conclusión
Con solo unas pocas líneas de código convertiste datos sueltos en un resumen listo para analizar, controlando las filas, las columnas, la agregación y los totales. La tabla dinámica es una herramienta que usarás una y otra vez en informes y análisis. El siguiente paso natural es exportar el resultado con tabela.to_excel("resumo.xlsx") o crear un gráfico a partir de él. ¿Cuál será la primera dimensión que vas a cruzar en tus propios datos?