pivot_table en pandas: guía con ejemplos

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 aggfunc y 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

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir