Pandas DataFrame.pivot_table() función
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 de
pivot()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
# 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:
- Los datos originales están en formato largo; cada fila registra las ventas de un producto en una región.
pivot_table()Se usa product como índice de filas, region como índice de columnas y sales como valores.- Se utiliza
aggfunc='sum'para sumar y resumir las ventas. - 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 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
# 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 el
margins_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 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.- Cuando
valuesCuando 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.
Otras extensiones
Funciones comunes de Pandas