Pandas DataFrame.pivot_table() función

Pandas 常用函数Funciones comunes de Pandas


df.pivot_table()es un método miembro de DataFrame, utilizado paracrear tablas dinámicas. Espivot()una versión mejorada de pivot, que soporta operaciones de agregación y puede manejar combinaciones repetidas de índices de filas y columnas.

La tabla dinámica es una de las herramientas más utilizadas en el análisis de datos; permite agrupar, resumir y remodelar datos desde diferentes perspectivas, facilitando la detección de patrones y tendencias en los datos.

Definición del término: pivot_tablesignifica "tabla dinámica"; es una tabla que puede cambiar dinámicamente la disposición de los datos y admite la agregación automática de datos repetidos.


Sintaxis básica y parámetros

df.pivot_table()es un método de instancia de DataFrame, que se invoca mediante el operador punto.

Formato de sintaxis

DataFrame.pivot_table(values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')

Descripción de parámetros

  • Parámetro: index
    • Tipo: nombre de columna, etiqueta, lista de etiquetas o None.
    • Descripción: columna utilizada como índice de filas. Puede ser una sola columna o varias columnas (lista); varias columnas crean un índice jerárquico.
  • Parámetro: columns
    • Tipo: nombre de columna o etiqueta.
    • Descripción: columna utilizada como índice de columnas; se usa para expandir los valores únicos como nombres de columnas.
  • Parámetro: values
    • Tipo: nombre de columna, etiqueta, lista de etiquetas o None.
    • Descripción: columnas numéricas a agregar. Si no se especifica, se agregan todas las columnas numéricas.
  • Parámetro: aggfunc
    • Tipo: función, cadena o lista de funciones.
    • Descripción: función de agregación. Los valores comunes incluyen'sum'(suma),'mean'(promedio, por defecto),'count'(conteo),'min'(mínimo),'max'(máximo),'median'(mediana),'std'(desviación estándar), etc.
  • Parámetro: fill_value
    • Tipo: escalar o None.
    • Descripción: valor utilizado para rellenar valores faltantes. Por defecto es None, conservando NaN.
  • Parámetro: margins
    • Tipo: valor booleano.
    • Descripción: si se añaden totales de filas y columnas. Por defecto es False. Al establecerlo en True, se añaden datos resumidos al final de filas y columnas.
  • Parámetro: margins_name
    • Tipo: cadena.
    • Descripción: nombre de la fila/columna de totales; por defecto es 'All'. Solo es efectivo cuando margins=True.

Descripción de la función

  • Valor de retorno: devuelve un DataFrame, es decir, la tabla dinámica.
  • Características: a diferencia depivot()pivot,pivot_table()no genera errores por combinaciones duplicadas de index+columns, y automáticamente utilizaaggfuncpara la agregación.

Ejemplos

Dominemos a fondo, mediante una serie de ejemplos de simples a complejos,df.pivot_table()el uso de pivot_table.

Ejemplo 1: Uso básico - Crear una tabla dinámica simple

Ejemplo

import pandas as pd

# 1. Crear datos de ventas
sales = pd.DataFrame({
    'product': ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'],
    'region': ['North', 'North', 'North', 'South', 'South', 'South', 'East', 'East', 'East', 'West', 'West', 'West'],
    'sales': [100, 150, 200, 180, 170, 160, 190, 200, 210, 220, 230, 240]
})

print("=== Datos de ventas ===")
print(sales)

# 2. Crear tabla dinámica - Resumir ventas por producto y región (la función de agregación por defecto es mean)
pivot = sales.pivot_table(values='sales', index='product', columns='region', aggfunc='sum')
print("n=== df.pivot_table() Tabla dinámica de ventas (suma) ===")
print(pivot)

Resultado esperado:

=== 销售数据 ===
    product  region  sales
0         A   North    100
1         B   North    150
2         C   North    200
3         A   South    180
4         B   South    170
5         C   South    160
6         A   East    190
7         B   East    200
8         C   East    210
9         A   West    220
10        B   West    230
11        C   West    240

=== df.pivot_table() 销售透视表(求和)===
region   East  North  South  West
product
A         190    100    180   220
B         200    150    170   230
C         210    200    160   240

Análisis del código:

  1. Los datos originales están en formato largo; cada fila registra las ventas de un producto en una región.
  2. pivot_table()Se usa product como índice de filas, region como índice de columnas y sales como valores.
  3. Se utilizaaggfunc='sum'para sumar y resumir las ventas.
  4. El resultado es una tabla bidimensional clara, que facilita comparar el rendimiento de ventas de diferentes productos en diferentes regiones.

Ejemplo 2: Usar diferentes funciones de agregación

aggfuncEl parámetro puede especificar múltiples formas de agregación para analizar datos.

Ejemplo

import pandas as pd
import numpy as np

# 1. Crear datos de ventas más completos (cada producto tiene varios registros)
sales = pd.DataFrame({
    'product': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'],
    'region': ['North', 'North', 'South', 'South', 'East', 'East', 'West', 'West', 'North', 'South'],
    'sales': [100, 150, 200, 180, 190, 200, 220, 230, 110, 190],
    'quantity': [10, 15, 20, 18, 19, 20, 22, 23, 11, 19]
})

print("=== Datos de ventas ===")
print(sales)

# 2. Calcular el promedio de ventas (función de agregación por defecto)
print("n=== Promedio de ventas ===")
mean_result = sales.pivot_table(values='sales', index='product', columns='region', aggfunc='mean')
print(mean_result.round(1))

# 3. Usar múltiples funciones de agregación a la vez (pasando un diccionario)
print("n=== Múltiples funciones de agregación ===")
multi_agg = sales.pivot_table(
    values='sales',
    index='product',
    columns='region',
    aggfunc={'sales': ['sum', 'mean', 'max']}
)
print(multi_agg)

# 4. Usar diferentes funciones de agregación para diferentes columnas
print("n=== Diferentes agregaciones para diferentes columnas ===")
diff_agg = sales.pivot_table(
    values=['sales', 'quantity'],
    index='product',
    columns='region',
    aggfunc={'sales': 'sum', 'quantity': 'mean'}
)
print(diff_agg)

Resultado esperado:

=== 销售数据 ===
   product  region  sales quantity
0        A   North    100       10
1        B   North    150       15
2        A   South    200       20
3        B   South    180       18
4        A   East    190       19
5        B   East    200       20
6        A   West    220       22
7        B   West    230       23
8        A   North    110       11
9        B   South    190       19

=== 销售额平均值 ===
region   East  North  South  West
product
A       190.0  105.0  200.0  220.0
B       200.0  150.0  185.0  230.0

=== 多聚合函数 ===
        sales
          sum          mean  max
region  East North South West East North South West East North South West
product
A       190  210   200  220   190  105   200  220   190  110   200  220
B       200  150   370  230   200  150   185  230   200  150   190  230

=== 不同列不同聚合 ===
        sales        quantity
region   East North South West  East North South West
product
A         190  210   200  220  19.0  10.5  20.0  22.0
B         200  150   370  230  20.0  15.0  18.5  23.0

Análisis del código:

  • aggfuncPuede ser una sola cadena (como 'sum', 'mean'), o también una lista o un diccionario.
  • Al pasar un diccionario, se pueden especificar diferentes funciones de agregación para diferentes columnas.
  • El promedio de ventas del producto A en la región Norte es 105 ((100+110)/2), lo que demuestra la capacidad de pivot_table() para manejar automáticamente valores duplicados.

Ejemplo 3: Usar margins para añadir totales

Usando elmarginsparámetro se pueden añadir totales de filas y columnas, lo que facilita ver los datos resumidos.

Ejemplo

import pandas as pd

# 1. Crear datos de ventas
sales = pd.DataFrame({
    'product': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'],
    'region': ['North', 'North', 'South', 'South', 'East', 'East', 'West', 'West'],
    'sales': [100, 150, 200, 180, 190, 200, 220, 230]
})

# 2. Tabla dinámica sin totales
print("=== Sin totales ===")
no_margins = sales.pivot_table(values='sales', index='product', columns='region', aggfunc='sum')
print(no_margins)

# 3. Añadir totales de filas y columnas
print("n=== Añadir totales (margins=True) ===")
with_margins = sales.pivot_table(
    values='sales',
    index='product',
    columns='region',
    aggfunc='sum',
    margins=True
)
print(with_margins)

# 4. Personalizar el nombre de los totales
print("n=== Nombre personalizado para totales ===")
custom_name = sales.pivot_table(
    values='sales',
    index='product',
    columns='region',
    aggfunc='sum',
    margins=True,
    margins_name='Total'
)
print(custom_name)

# 5. Tabla dinámica con índice de filas múltiple
print("n=== Índice de filas múltiple ===")
multi_index = sales.pivot_table(
    values='sales',
    index=['product', 'region'],
    aggfunc='sum'
)
print(multi_index)

Resultado esperado:

=== 无合计 ===
region   East  North  South  West
product
A         190    100    200   220
B         200    150    180   230

=== 添加合计 (margins=True) ===
region   East  North  South  West   All
product
A         190    100    200   220   710
B         200    150    180   230   760
All       390    250    380   450  1470

=== 自定义合计名称 ===
region   East North South West   总计
product
A       190  100   200  220    710
B       200  150   180  230    760
总计     390  250   380  450   1470

Análisis del código:

  • margins=TrueSe añadirá una fila "All" (total) en la parte inferior de la tabla dinámica y una columna "All" (total) en el lado derecho.
  • Se puede usar elmargins_nameparámetro para personalizar el nombre de los totales, como 'Total'.
  • La columna All muestra la suma de ventas de cada producto en las diferentes regiones, la fila All muestra la suma de ventas de todos los productos en cada región, y la esquina inferior derecha es la suma de todos los datos.

Ejemplo 4: Usar fill_value para manejar valores faltantes

Usando elfill_valueparámetro se pueden rellenar los valores faltantes generados después de la tabulación dinámica.

Ejemplo

import pandas as pd
import numpy as np

# 1. Crear datos (algunas combinaciones producto-región no existen)
sales = pd.DataFrame({
    'product': ['A', 'B', 'A', 'B'],
    'region': ['North', 'North', 'South', 'South'],
    'sales': [100, 150, 200, 180]
})

print("=== Datos originales ===")
print(sales)

# 2. Sin rellenar valores faltantes (por defecto)
print("n=== Sin rellenar valores faltantes ===")
no_fill = sales.pivot_table(values='sales', index='product', columns='region')
print(no_fill)

# 3. Rellenar valores faltantes con 0
print("n=== Rellenar valores faltantes con 0 ===")
fill_zero = sales.pivot_table(
    values='sales',
    index='product',
    columns='region',
    fill_value=0
)
print(fill_zero)

# 4. Demostrar la agregación automática de valores duplicados
data_with_duplicates = pd.DataFrame({
    'product': ['A', 'A', 'B', 'B', 'A'],
    'region': ['North', 'North', 'South', 'South', 'North'],
    'sales': [100, 120, 200, 180, 90]
})

print("n=== Datos con valores duplicados ===")
print(data_with_duplicates)

print("n=== Agregación automática (pivot genera error, pivot_table suma automáticamente) ===")
auto_agg = data_with_duplicates.pivot_table(
    values='sales',
    index='product',
    columns='region',
    aggfunc='sum'
)
print(auto_agg)

Resultado esperado:

=== 原始数据 ===
  product  region  sales
0       A   North    100
1       B   North    150
2       A   South    200
3       B   South    180

=== 不填充缺失值 ===
region   North  South
product
A         100.0  200.0
B         150.0  180.0

=== 填充缺失值为0 ===
region  North  South
product
A         100   200
B         150   180

=== 重复值数据 ===
  product  region  sales
0       A   North    100
1       A   North    120
2       B   South    200
3       B   South    180
4       A   North    90

=== 自动聚合(pivot会报错,pivot_table自动求和)===
region   North  South
product
A         310     NaN
B         NaN    380

Análisis del código:

  • fill_value=0Se pueden rellenar los valores faltantes con 0, lo que facilita cálculos posteriores.
  • Cuando hay combinaciones repetidas de product-region,pivot_table()automáticamente usaaggfuncpara la agregación, mientras quepivot()genera un error.
  • Las ventas totales del producto A en la región North son 310 (100+120+90), resultado de la suma automática.

Notas

Aviso importante:

  • pivot_table()ypivot()La principal diferencia en el manejo de valores duplicados es: pivot_table agrega automáticamente, mientras que pivot genera un error.
  • CuandovaluesCuando el parámetro no se especifica, se agregan todas las columnas numéricas.
  • marginsLos totales de filas/columnas añadidos por el parámetro afectan el procesamiento posterior de los datos; se debe tener cuidado al usarlo.
  • Al procesar datos a gran escala, pivot_table puede consumir bastante memoria; preste atención al control del volumen de datos.

Pandas 常用函数Funciones comunes de Pandas

Otras extensiones