pivot_table en pandas: guía con ejemplos

pandas.pivot_table() resume un DataFrame por filas y columnas, de forma parecida a una tabla dinámica. Permite agrupar, agregar varias métricas, crear totales y reorganizar el resultado sin escribir cada groupby manualmente.
La función es ideal para reportes exploratorios. Para usarla bien debes declarar la granularidad: qué representa cada fila, qué categorías formarán columnas y cómo se agregan observaciones repetidas.
DataFrame de ejemplo
import pandas as pd
ventas = pd.DataFrame({
"region": ["Norte", "Norte", "Sur", "Sur", "Sur"],
"canal": ["Web", "Tienda", "Web", "Tienda", "Web"],
"vendedor": ["Ana", "Ana", "Luis", "Marta", "Luis"],
"importe": [120, 80, 150, 90, 60],
"unidades": [2, 1, 3, 2, 1],
})
Primera tabla dinámica
tabla = ventas.pivot_table(
index="region",
columns="canal",
values="importe",
aggfunc="sum",
)
index define las filas, columns crea encabezados, values elige la métrica y aggfunc resuelve múltiples registros por combinación.
Valores faltantes y totales
Una combinación sin observaciones produce NaN. Puedes mostrar cero y añadir márgenes:
tabla = ventas.pivot_table(
index="region",
columns="canal",
values="importe",
aggfunc="sum",
fill_value=0,
margins=True,
margins_name="Total",
)
Usa cero solo si “no hubo transacciones” equivale realmente a cero. Si el dato falta por una carga incompleta, sustituirlo oculta un problema de valores nulos.
Varias funciones agregadas
tabla = ventas.pivot_table(
index="region",
values="importe",
aggfunc=["sum", "mean", "count"],
)
El resultado tiene columnas multinivel. Para exportar, puedes aplanarlas:
tabla.columns = [
"_".join(map(str, col)).strip("_")
for col in tabla.columns.to_flat_index()
]
tabla = tabla.reset_index()
Evita redondear antes del resumen; redondea al presentar.
Varias métricas con reglas diferentes
tabla = ventas.pivot_table(
index=["region", "vendedor"],
columns="canal",
values=["importe", "unidades"],
aggfunc={"importe": "sum", "unidades": "mean"},
fill_value=0,
)
La granularidad es una fila por región y vendedor. Antes de interpretar el promedio de unidades, confirma si cada registro representa un pedido, una línea de producto u otra unidad.
pivot, pivot_table y groupby
| Herramienta | Cuándo usarla |
|---|---|
pivot |
Cada combinación es única; no agrega |
pivot_table |
Puede haber repetidos y necesitas resumen |
groupby |
Quieres control explícito o salida larga |
pivot falla cuando existen varias filas para la misma combinación. Ese error es información útil: obliga a revisar la granularidad. pivot_table no debería utilizarse para tapar duplicados sin elegir conscientemente la función.
El artículo sobre GroupBy en pandas explica el patrón dividir-aplicar-combinar en mayor detalle.
Porcentajes dentro de la tabla
tabla = ventas.pivot_table(
index="region",
columns="canal",
values="importe",
aggfunc="sum",
fill_value=0,
)
porcentaje_fila = tabla.div(tabla.sum(axis=1), axis=0).mul(100)
axis=1 suma por fila; axis=0 trabajaría por columna. Comprueba divisiones entre cero.
Filtrar antes o después
Filtrar el DataFrame antes cambia los datos que entran al cálculo:
recientes = ventas.loc[ventas["importe"] > 75]
tabla = recientes.pivot_table(...)
Filtrar la tabla resultante cambia los grupos visibles. Separa ambos pasos y usa nombres que indiquen el universo analizado.
Volver a formato ordenado
Para muchas gráficas y modelos conviene regresar a formato largo:
largo = (
tabla
.reset_index()
.melt(id_vars="region", var_name="canal", value_name="importe")
)
Consulta pandas melt para controlar identificadores y columnas medidas.
Errores frecuentes
- No especificar
aggfuncy aceptar el promedio predeterminado. - Convertir ausencias en cero sin justificación.
- Confundir count de filas con número de entidades únicas.
- Crear columnas multinivel y exportarlas sin nombres claros.
- Promediar promedios con tamaños distintos.
- Usar pivot_table para ocultar claves duplicadas.
- Mezclar importes y unidades sin etiquetas.
Una tabla dinámica es confiable cuando puedes explicar su universo, granularidad, agregación y tratamiento de ausencias en una sola frase.
Preguntas frecuentes
¿Qué hace pivot_table en pandas?
Agrupa un DataFrame por filas y columnas y aplica funciones de agregación a los valores.
¿Cuál es la diferencia entre pivot y pivot_table?
pivot solo reorganiza combinaciones únicas; pivot_table puede resolver varias observaciones mediante una agregación.
¿Cuál es la agregación predeterminada?
La media suele ser el valor predeterminado de pivot_table. Declara aggfunc para que la intención sea explícita.
¿Cómo agrego totales?
Usa margins=True y, si quieres, margins_name para cambiar la etiqueta del total.
¿Cómo sustituyo NaN por cero?
Usa fill_value=0 solo cuando la ausencia signifique realmente que la medida es cero.
¿Cómo quito las columnas multinivel?
Aplana tabla.columns.to_flat_index(), combina los niveles con nombres estables y luego usa reset_index si necesitas columnas normales.

Deja una respuesta