Función pd.crosstab() de Pandas
pd.crosstab()Es una función de la biblioteca Pandas utilizada paracalcular tablas cruzadas (Cross Tabulation). Puede calcular la frecuencia o estadísticas agregadas de dos o más variables, generando una tabla similar a una tabla dinámica de Excel.
La tabla cruzada es una herramienta muy útil en el análisis estadístico, se usa comúnmente para analizar la relación entre dos o más variables categóricas, por ejemplo, contar el número de empleados hombres y mujeres en diferentes departamentos.
Definición de la palabra: crosstabEs la abreviatura de "cross tabulation" (tabla cruzada), un tipo de tabla estadística que muestra la distribución conjunta de dos o más variables.
Sintaxis básica y parámetros
pd.crosstab()Es una función de nivel superior de la biblioteca Pandas, utilizada para calcular tablas cruzadas.
Formato de sintaxis
pd.crosstab(index, columns, values=None, aggfunc=None, margins=False, margins_name='All', dropna=True, normalize=False)
Descripción de parámetros
- Parámetro:
index- Tipo: array-like, Series o lista.
- Descripción: datos utilizados como índice de filas. Puede ser una sola columna o varias columnas (lista).
- Parámetro:
columns- Tipo: array-like, Series o lista.
- Descripción: datos utilizados como índice de columnas. Puede ser una sola columna o varias columnas (lista).
- Parámetro:
values- Tipo: array-like o None.
- Descripción: valores a agregar. Si se especifican, deben combinarse con
aggfuncel parámetro.
- Parámetro:
aggfunc- Tipo: función o cadena.
- Descripción: función de agregación (por ejemplo, 'sum', 'mean', 'count', etc.). Cuando se especifica
valueses necesario utilizarlo.
- Parámetro:
margins- Tipo: valor booleano.
- Descripción: si es
True, agrega totales de filas y columnas. Por defecto esFalse。
- Parámetro:
normalize- Tipo: booleano o 'all', 'index', 'columns'.
- Descripción: si es
True, divide los valores por el total, generando proporciones (0-1). También se puede especificar 'index' o 'columns' para normalizar por filas o por columnas.
Descripción de la función
- Valor de retorno: Devuelve un DataFrame que representa la relación cruzada entre dos o más variables.
- Efecto: Genera una tabla donde las filas y columnas representan diferentes variables categóricas, y las celdas muestran la frecuencia o el valor agregado correspondiente.
Ejemplos
Aprendamos completamente mediante una serie de ejemplos de simples a complejos,pd.crosstab()su uso.
Ejemplo 1: Uso básico - Tabla cruzada de dos variables categóricas
Ejemplos
# 1. Crear datos de empleados
employees = pd.DataFrame({
'department': ['Sales', 'Sales', 'Sales', 'Engineering', 'Engineering', 'HR', 'HR', 'Sales', 'Engineering', 'HR'],
'gender': ['Male', 'Female', 'Female', 'Male', 'Male', 'Female', 'Male', 'Female', 'Female', 'Male']
})
print("=== Datos de empleados ===")
print(employees)
# 2. Calcular la tabla cruzada de departamento y género (frecuencia)
result = pd.crosstab(employees['department'], employees['gender'])
print("n=== Tabla cruzada de departamento y género de pd.crosstab() ===")
print(result)
Resultado esperado de la ejecución:
=== 员工数据 === department gender 0 Sales Male 1 Sales Female 2 Sales Female 3 Engineering Male 4 Engineering Male 5 HR Female 6 HR Male 7 Sales Female 8 Engineering Female 9 HR Male === pd.crosstab() 部门与性别交叉表 === gender Female Male department Engineering 1 2 HR 1 2 Sales 3 1
Análisis del código:
- La tabla de resultados muestra el número de empleados hombres y mujeres en cada departamento.
Ejemplo 2: Agregar totales de filas y columnas y normalización
Usandomarginsel parámetro se pueden agregar totales,normalizecon el parámetro se puede ver la distribución de proporciones.
Ejemplos
# Usando los datos de empleados anteriores
employees = pd.DataFrame({
'department': ['Sales', 'Sales', 'Sales', 'Engineering', 'Engineering', 'HR', 'HR', 'Sales', 'Engineering', 'HR'],
'gender': ['Male', 'Female', 'Female', 'Male', 'Male', 'Female', 'Male', 'Female', 'Female', 'Male']
})
# 1. Agregar totales de filas y columnas
result_margins = pd.crosstab(employees['department'], employees['gender'], margins=True)
print("=== Agregar totales (margins=True) ===")
print(result_margins)
# 2. Normalizar - convertir a proporciones
print("n=== Normalización general (normalize=True) ===")
result_norm = pd.crosstab(employees['department'], employees['gender'], normalize=True)
print(result_norm.round(3))
# 3. Normalizar por filas (cada fila suma 1)
print("n=== Normalización por filas (normalize='index') ===")
result_norm_index = pd.crosstab(employees['department'], employees['gender'], normalize='index')
print(result_norm_index.round(3))
# 4. Normalizar por columnas (cada columna suma 1)
print("n=== Normalización por columnas (normalize='columns') ===")
result_norm_col = pd.crosstab(employees['department'], employees['gender'], normalize='columns')
print(result_norm_col.round(3))
Resultado esperado de la ejecución:
=== 添加合计 (margins=True) === gender Female Male All department Engineering 1 2 3 HR 1 2 3 Sales 3 1 4 All 5 5 10 === 整体归一化 (normalize=True) === gender Female Male department Engineering 0.1 0.2 HR 0.1 0.2 Sales 0.3 0.1 === 按行归一化 (normalize='index') === gender Female Male department Engineering 0.333 0.667 HR 0.333 0.667 Sales 0.75 0.25 === 按列归一化 (normalize='columns') === gender Female Male department Engineering 0.2 0.4 HR 0.2 0.4 Sales 0.6 0.2
Análisis del código:
- La normalización facilita el análisis de las relaciones de proporción y permite comprender la distribución relativa de los géneros en cada departamento.
- La normalización por filas muestra la distribución porcentual de los géneros en cada departamento.
- La normalización por columnas muestra la proporción de distribución de cada género en los diferentes departamentos.
Ejemplo 3: Múltiples variables y funciones de agregación
Se pueden usar múltiples variables de filas/columnas y utilizar funciones de agregación para calcular valores estadísticos.
Ejemplos
import numpy as np
# 1. Crear datos de ventas
sales = pd.DataFrame({
'region': ['North', 'North', 'South', 'South', 'East', 'East', 'West', 'West', 'North', 'South'],
'product': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'B', 'A'],
'quarter': ['Q1', 'Q1', 'Q1', 'Q1', 'Q2', 'Q2', 'Q2', 'Q2', 'Q2', 'Q2'],
'sales': [100, 150, 200, 180, 120, 160, 190, 170, 140, 210]
})
print("=== Datos de ventas ===")
print(sales)
# 2. Usar múltiples variables de filas
print("n=== Tabla cruzada de región y producto (frecuencia) ===")
result_multi = pd.crosstab([sales['region'], sales['product']], sales['quarter'])
print(result_multi)
# 3. Usar values y aggfunc para calcular el monto de ventas
print("n=== Total de ventas por región y trimestre ===")
result_sum = pd.crosstab(sales['region'], sales['quarter'], values=sales['sales'], aggfunc='sum')
print(result_sum)
# 4. Calcular el promedio de ventas
print("n=== Promedio de ventas por región y trimestre ===")
result_mean = pd.crosstab(sales['region'], sales['quarter'], values=sales['sales'], aggfunc='mean')
print(result_mean.round(1))
Resultado esperado de la ejecución:
=== 销售数据 ===
region product quarter sales
0 North A Q1 100
1 North B Q1 150
2 South A Q1 200
3 South B Q1 180
4 East A Q2 120
5 East B Q2 160
6 West A Q2 190
7 West B Q2 170
8 North B Q2 140
9 South A Q2 210
=== 区域和产品的交叉表(频次)===
quarter Q1 Q2
region product
East A 0 1
B 0 1
North A 1 0
B 1 1
South A 1 1
B 1 0
West A 0 1
B 0 1
=== 区域和季度的销售额合计 ===
quarter Q1 Q2
region
East NaN 280
North 250 140
South 380 210
West NaN 360
=== 区域和季度的平均销售额 ===
quarter Q1 Q2
region
East NaN 140.0
North 125.0 140.0
South 190.0 210.0
West NaN 180.0
Análisis del código:
- Usar múltiples variables de filas (en forma de lista) permite crear tablas cruzadas con índice de múltiples niveles.
- Cada celda muestra el número de apariciones de una combinación específica de región y producto en un trimestre determinado.
- Usar los parámetros values y aggfunc permite calcular agregaciones de valores numéricos reales (suma, promedio, etc.).
Ejemplo 4: Manejo de valores faltantes
dropnaEl parámetro controla si se incluyen categorías faltantes.
Ejemplos
import numpy as np
# 1. Datos con valores faltantes
data = pd.DataFrame({
'A': ['a', 'a', 'b', np.nan, 'a', 'b'],
'B': ['x', 'y', 'x', 'x', np.nan, 'y']
})
print("=== Datos con valores faltantes ===")
print(data)
# 2. Eliminar combinaciones con valores faltantes por defecto
result_drop = pd.crosstab(data['A'], data['B'])
print("n=== Eliminar valores faltantes por defecto (dropna=True) ===")
print(result_drop)
# 3. Incluir categorías faltantes
result_keep = pd.crosstab(data['A'], data['B'], dropna=False)
print("n=== Incluir categorías faltantes (dropna=False) ===")
print(result_keep)
Resultado esperado de la ejecución:
=== 包含缺失值的数据 ===
A B
0 a x
1 a y
2 b x
3 NaN x
4 a NaN
5 b y
=== 默认移除缺失值 (dropna=True) ===
B x y
A
a 1 1
b 1 1
=== 包含缺失值 (dropna=False) ===
B x y NaN
A
a 1 1 1
b 1 1 0
NaN 1 0 0
Análisis del código:
- Por defecto
dropna=Truese eliminan las filas y columnas con valores faltantes, mostrando solo datos válidos. - Usando
dropna=Falsese puede ver la frecuencia de las combinaciones que contienen valores faltantes.
Otras extensionesConsejo:
pd.crosstab()es adecuado para analizar la relación entre variables categóricas. Si necesita un resumen de datos más complejo (como calcular múltiples indicadores de agregación), utilicepd.pivot_table()la función.
Funciones comunes de Pandas