Función pd.crosstab() de Pandas

Pandas 常用函数Funciones comunes 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 conaggfuncel 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 especificavalueses necesario utilizarlo.
  • Parámetro: margins
    • Tipo: valor booleano.
    • Descripción: si esTrue, agrega totales de filas y columnas. Por defecto esFalse。
  • Parámetro: normalize
    • Tipo: booleano o 'all', 'index', 'columns'.
    • Descripción: si esTrue, 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

import pandas as pd

# 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:

  1. 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

import pandas as pd

# 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 pandas as pd
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 pandas as pd
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 defectodropna=Truese eliminan las filas y columnas con valores faltantes, mostrando solo datos válidos.
  • Usandodropna=Falsese puede ver la frecuencia de las combinaciones que contienen valores faltantes.

Consejo: 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.

Pandas 常用函数Funciones comunes de Pandas

Otras extensiones