Función Pandas pd.pivot_table()
pd.pivot_table()Es la función de la biblioteca Pandas que se utiliza paracrear tablas dinámicasLa función. La tabla dinámica es una herramienta común en las hojas de cálculo que permite agrupar, agregar y remodelar datos, facilitando el análisis desde diferentes perspectivas.
ypd.crosstab()En comparación,pivot_table()es más potente, admite múltiples funciones de agregación, maneja valores faltantes y una remodelación de datos más compleja.
Significado de la palabra: pivot_tableSignifica 'tabla dinámica', es un tipo de tabla que puede cambiar dinámicamente la disposición de los datos y puede resumir y analizar datos desde múltiples dimensiones.
Sintaxis básica y parámetros
pd.pivot_table()Es una función de nivel superior de la biblioteca Pandas, utilizada para crear tablas dinámicas.
Formato de sintaxis
pd.pivot_table(data, 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:
data- Tipo: DataFrame.
- Descripción: El DataFrame de datos de origen.
- Parámetro:
values- Tipo: Nombre de columna o lista de nombres de columna.
- Descripción: Las columnas a agregar. Si no se especifica, se agregan todas las columnas numéricas.
- Parámetro:
index- Tipo: Nombre de columna, lista de nombres de columna o función.
- Descripción: La 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 lista de nombres de columna.
- Descripción: La columna utilizada como índice de columnas.
- Parámetro:
aggfunc- Tipo: Función, cadena o lista de funciones.
- Descripción: Función de agregación. Los valores comunes incluyen 'sum', 'mean', 'count', 'min', 'max', 'median', 'std', etc. El valor predeterminado es 'mean'.
- Parámetro:
fill_value- Tipo: Escalar o None.
- Descripción: Valor numérico utilizado para rellenar valores faltantes.
- Parámetro:
margins- Tipo: Booleano.
- Descripción: Si se agregan totales de filas y columnas. El valor predeterminado es
False。
Descripción de la función
- Valor de retorno: Devuelve un DataFrame, es decir, la tabla dinámica.
- Efecto: Remodela y resume los datos según las filas, columnas y funciones de agregación especificadas.
Ejemplos
Vamos a dominar completamente, a través de una serie de ejemplos desde simples hasta complejos,pd.pivot_table()el uso de la función.
Ejemplo 1: Uso básico - Crear una tabla dinámica simple
Ejemplo
import numpy as np
# 1. Crear los datos de ventas
sales = pd.DataFrame({
'date': pd.date_range('2023-01-01', periods=12, freq='D'),
'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
pivot = pd.pivot_table(sales, values='sales', index='product', columns='region', aggfunc='sum')
print("n=== Tabla dinámica de ventas de pd.pivot_table() ===")
print(pivot)
# 3. Usar fill_value para rellenar valores faltantes
print("n=== Rellenar valores faltantes (fill_value=0) ===")
pivot_fill = pd.pivot_table(sales, values='sales', index='product', columns='region', aggfunc='sum', fill_value=0)
print(pivot_fill)
Resultado esperado:
=== 销售数据 ===
date product region sales
0 2023-01-01 A North 100
1 2023-01-01 B North 150
2 2023-01-01 C North 200
3 2023-01-01 A South 180
4 2023-01-01 B South 170
5 2023-01-01 C South 160
6 2023-01-01 A East 190
7 2023-01-01 B East 200
8 2023-01-01 C East 210
9 2023-01-01 A West 220
10 2023-01-01 B West 230
11 2023-01-01 C West 240
=== pd.pivot_table() 销售透视表 ===
region East North South West
product
A 400.0 100.0 180.0 220.0
B 400.0 150.0 170.0 230.0
C 410.0 200.0 160.0 240.0
=== 填充缺失值 (fill_value=0) ===
region East North South West
product
A 400 100 180 220
B 400 150 170 230
C 410 200 160 240
Análisis del código:
- La tabla dinámica resume las ventas por producto (filas) y región (columnas).
fill_value=0Muestra las combinaciones faltantes como 0 para facilitar la lectura.
Ejemplo 2: Uso de diferentes funciones de agregación
aggfuncEl parámetro puede especificar múltiples formas de agregación para analizar los datos.
Ejemplo
import numpy as np
# 1. Crear datos de ventas más completos
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. Resumen (suma)
print("n=== Suma de ventas ===")
sum_result = pd.pivot_table(sales, values='sales', index='product', columns='region', aggfunc='sum')
print(sum_result)
# 3. Calcular el promedio de ventas
print("n=== Promedio de ventas ===")
mean_result = pd.pivot_table(sales, values='sales', index='product', columns='region', aggfunc='mean')
print(mean_result.round(1))
# 4. Calcular múltiples estadísticos a la vez (pasando una lista)
print("n=== Calcular suma y media al mismo tiempo ===")
multi_agg = pd.pivot_table(sales, values='sales', index='product', columns='region', aggfunc=['sum', 'mean'])
print(multi_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 210 200 220
B 200 150 370 230
=== 销售额平均值 ===
region East North South West
product
A 190 105.0 200 220
B 200 150.0 185 230
=== 同时计算数量和、均值 ===
sum mean
region East North South West East North South West
product
A 190 210 200 220 190 105.0 200 220
B 200 150 370 230 200 150.0 185.0 230
Análisis del código:
- El uso de diferentes funciones de agregación permite calcular distintos indicadores estadísticos.
- Cuando se pasan varias funciones de agregación a la vez, la tabla dinámica crea un índice de columnas de varios niveles.
Ejemplo 3: Uso de margins para agregar totales
El uso delmarginsparámetro permite agregar totales de filas y columnas, facilitando la visualización de datos de resumen.
Ejemplo
# Usar los datos de ventas anteriores
sales = pd.DataFrame({
'product': ['A', 'B', 'A', 'B', 'A', 'B'],
'region': ['North', 'North', 'South', 'South', 'East', 'East'],
'sales': [100, 150, 200, 180, 190, 200]
})
# 1. Sin totales
print("=== Sin totales ===")
print(pd.pivot_table(sales, values='sales', index='product', columns='region', aggfunc='sum'))
# 2. Agregar totales de filas y columnas
print("n=== Agregar totales (margins=True) ===")
result = pd.pivot_table(sales, values='sales', index='product', columns='region', aggfunc='sum', margins=True)
print(result)
# 3. Personalizar el nombre del total
print("n=== Personalizar el nombre del total ===")
result_name = pd.pivot_table(sales, values='sales', index='product', columns='region', aggfunc='sum', margins=True, margins_name='Total')
print(result_name)
# 4. Totales con índice de filas de varios niveles
print("n=== Índice de filas de varios niveles ===")
multi_index = pd.pivot_table(sales, values='sales', index=['product', 'region'], aggfunc='sum')
print(multi_index)
Resultado esperado:
=== 无合计 ===
region East North South
product
A 190 100 200
B 200 150 180
=== 添加合计 (margins=True) ===
region East North South All
product
A 190 100 200 490
B 200 150 180 530
All 390 250 380 1020
=== 自定义合计名称 ===
region East North South 总计
product
A 190 100 200 490
B 200 150 180 530
总计 390 250 380 1020
=== 多层行索引 ===
sales
product region
A East 190
North 100
South 200
B East 200
North 150
South 180
Análisis del código:
margins=TrueSe agregarán filas y columnas "All" que muestran los datos totales.margins_nameSe puede personalizar el nombre del total.
Ejemplo 4: Índices múltiples y tablas dinámicas complejas
Se pueden usar varias columnas para crear una tabla dinámica con índice de varios niveles.
Ejemplo
# 1. Crear datos con múltiples variables categóricas
data = pd.DataFrame({
'year': [2022, 2022, 2022, 2023, 2023, 2023],
'quarter': ['Q1', 'Q2', 'Q3', 'Q1', 'Q2', 'Q3'],
'product': ['A', 'A', 'B', 'B', 'A', 'B'],
'sales': [100, 150, 200, 220, 180, 250]
})
print("=== Datos ===")
print(data)
# 2. Usar varias columnas como índice de filas
print("n=== Tabla dinámica de varios años y trimestres ===")
pivot = pd.pivot_table(data, values='sales', index=['year', 'quarter'], columns='product', aggfunc='sum')
print(pivot)
# 3. Varias columnas como índice de columnas
print("n=== Tabla dinámica cruzada compleja ===")
pivot_multi = pd.pivot_table(data, values='sales', index='year', columns=['product', 'quarter'], aggfunc='sum')
print(pivot_multi)
# 4. Usar fill_value para manejar valores faltantes
print("n=== Rellenar valores faltantes ===")
pivot_fill = pd.pivot_table(data, values='sales', index=['year', 'quarter'], columns='product', aggfunc='sum', fill_value=0)
print(pivot_fill)
Resultado esperado:
=== 数据 === year quarter product sales 0 2022 Q1 A 100 1 2022 Q2 A 150 2 2022 Q3 B 200 3 2023 Q1 B 220 4 2023 Q2 A 180 5 2023 Q3 B 250 === 多年份多季度透视 === product A B year quarter 2022 Q1 100.0 NaN 2022 Q2 150.0 NaN 2022 Q3 NaN 200.0 2023 Q1 NaN 220.0 2023 Q2 180.0 NaN 2023 Q3 NaN 250.0 === 复杂交叉透视 === product A B quarter Q1 Q2 Q3 Q1 Q2 Q3 year 2022 100 150 200 NaN NaN NaN 2023 NaN 180 250 NaN NaN NaN === 填充缺失值 === product A B year quarter 2022 Q1 100 0 2022 Q2 150 0 2022 Q3 0 200 2023 Q1 0 220 2023 Q2 180 0 2023 Q3 0 250
Análisis del código:
- El índice de varios niveles se especifica mediante una lista
index=['year', 'quarter']para su implementación. fill_value=0Los datos faltantes se rellenan uniformemente con 0 para facilitar cálculos posteriores.
Otras extensionesSugerencia:
pd.pivot_table()Ofrece potentes funciones de tabla dinámica. Si solo se necesita contar la frecuencia de dos variables categóricas,pd.crosstab()puede resultar más conciso.pd.crosstab()Devuelve valores de frecuencia, mientras quepivot_table()puede calcular múltiples estadísticos como media, suma, desviación estándar, etc.pd.crosstab()Puede considerarsepivot_table()Enaggfunc='count'un caso especial.
Funciones comunes de Pandas