Skip to content

Pandas Crosstab: Crear tablas de crosstabulación simples en Python

La crosstabulación es una herramienta poderosa en el análisis de datos, que nos permite inspeccionar la relación entre dos o más variables categóricas o discretas. Este artículo profundizará en el mundo de pandas crosstab, una función en la biblioteca pandas de Python que simplifica la creación de tablas de crosstabulación. Exploraremos qué es pandas crosstab, cómo se compara con la función de tabla dinámica y cómo usarla de manera efectiva para la manipulación de datos.

Pandas es una herramienta popular de manipulación de datos en Python, que ofrece una variedad de funciones para el análisis de datos. Una de esas funciones es crosstab, que permite una crosstabulación fácil, proporcionando una forma simple pero efectiva de entender las relaciones en tus datos. Ya seas un analista de datos experimentado o un principiante en el campo, entender cómo usar pandas crosstab puede mejorar significativamente tus habilidades de manipulación de datos.

¿Quieres crear rápidamente visualizaciones de datos a partir de un dataframe de pandas en Python sin escribir código?

PyGWalker es una biblioteca de Python para el análisis exploratorio de datos con visualización. PyGWalker (opens in a new tab) puede simplificar tu flujo de trabajo de análisis y visualización de datos en Jupyter Notebook, convirtiendo tu dataframe de pandas (y dataframe de polars) en una interfaz de usuario estilo Tableau para exploración visual.

PyGWalker para visualización de datos (opens in a new tab)

¿Qué es Pandas Crosstab?

Pandas crosstab es una función que proporciona una forma simple de crear una crosstabulación de dos (o más) factores. Calcula una crosstabulación simple de dos o más matrices de datos. De forma predeterminada, proporciona una tabla de frecuencias de los factores a menos que se pasen una matriz de valores y una función de agregación.

Aquí hay un ejemplo básico de cómo usar pandas crosstab:

import pandas as pd
 
## Datos de ejemplo
data = {'A': ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'],
        'B': ['one', 'one', 'two', 'two', 'one', 'one'],
        'C': ['small', 'large', 'large', 'small', 'small', 'large'],
        'D': [1, 2, 2, 3, 3, 4]}
df = pd.DataFrame(data)
 
## Usar crosstab
tabla = pd.crosstab(df['A'], df['B'])
print(tabla)

En este ejemplo, creamos un DataFrame a partir de un diccionario y luego usamos pandas crosstab para crear una tabla de crosstabulación que muestra la frecuencia de las categorías 'B' para cada categoría 'A'.

¿Debería usar Pivot Table o Crosstab en Pandas?

Si bien tanto las tablas dinámicas como las crosstabulaciones en pandas cumplen propósitos similares, se utilizan en escenarios ligeramente diferentes. La tabla dinámica es una solución más general, utilizada para crear una nueva tabla derivada a partir de una dada. Por otro lado, crosstab es más especializado para calcular frecuencias de grupos.

La tabla dinámica puede manejar múltiples tipos de datos de entrada y puede manejar múltiples nombres de índice y columna, mientras que crosstab se utiliza principalmente para tablas de frecuencias. Entonces, si estás buscando crear una tabla de frecuencias, pandas crosstab es la opción a seguir. Sin embargo, si estás lidiando con tareas de manipulación de datos más complejas, una tabla dinámica podría ser una mejor elección.

¿Cómo definir una Crosstab en Python?

Definir una crosstab en Python utilizando pandas es sencillo. La sintaxis básica para crear una crosstabulación es la siguiente:

pd.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, margins_name: str = 'All', dropna: bool = True, normalize=False)

Esto es lo que significa cada parámetro:

  • index: similar a una matriz, valores para agrupar por en las filas.
  • columns: similar a una matriz, valores para agrupar por en las columnas.
  • values: similar a una matriz, opcional, matriz de valores para agregar según los factores.
  • rownames: secuencia, defecto Ninguno, si se pasa, debe coincidir con la cantidad de matrices de filas pasadas.
  • colnames: secuencia, defecto Ninguno, si se pasa, debe coincidir con la cantidad de matrices de columnas pasadas.
  • aggfunc: función, opcional, si se pasa, también se requiere especificar values.
  • margins: bool, defecto Falso, agrega subtotales en las filas/columnas (márgenes).
  • margins_name: str, defecto 'All', nombre de la fila/columna que contendrá los totales cuando margins sea True.
  • dropna: bool, defecto Verdadero, no incluye columnas cuyas entradas son todas NaN.
  • normalize: bool, columns, o 1, defecto Falso. Normaliza dividiendo todos los valores por la suma de los valores.

¿Cómo crear una Crosstab con Porcentajes en Pandas?

Crear una crosstabulación con porcentajes en pandas es bastante simple. Solo necesitas poner el parámetro normalize en Verdadero o especificar el eje (índice o columnas) que deseas normalizar. Aquí tienes un ejemplo:

import pandas as pd
 
## Datos de ejemplo
data = {'A': ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'],
        'B': ['one', 'one', 'two', 'two', 'one', 'one'],
        'C': ['small', 'large', 'large', 'small', 'small', 'large'],
        'D': [1, 2, 2, 3, 3, 4]}
df = pd.DataFrame(data)
 
## Usar crosstab con normalización
tabla = pd.crosstab(df['A'], df['B'], normalize=True)
print(tabla)

En este ejemplo, la crosstabulación mostrará la proporción de cada categoría en lugar del conteo, lo que proporciona una imagen más clara de la distribución de categorías.

¿Cuáles son algunas formas sencillas de hacer una Crosstab en Pandas?

Hay varias formas de crear crosstabulaciones en pandas, y el mejor método depende de tus necesidades específicas. Aquí hay tres formas sencillas de crear crosstabulaciones:  

  1. Crosstab básica: La forma más simple de crear una crosstabulación es pasar dos series a la función crosstab de pandas, que proporcionará una tabla de frecuencias.

  2. Crosstab con Agregación: Si tienes una tercera serie de valores, puedes pasarla a la función crosstab junto con una función de agregación (como mean, sum, etc.) para obtener un crosstab más complejo.

  3. Crosstab con Normalización: Al establecer el parámetro normalize en True, puedes crear un crosstab que muestre la proporción de cada categoría, lo cual puede ser útil para entender la distribución de las categorías.

Ejemplo de Crosstab en Pandas

Veamos un ejemplo práctico de cómo usar el crosstab de pandas. Supongamos que tenemos un conjunto de datos de las ventas de una tienda, incluyendo el tipo de producto vendido, la persona de ventas que realizó la venta y el número de unidades vendidas. Queremos crear un crosstab que muestre el total de unidades vendidas por cada persona de ventas para cada tipo de producto.

import pandas as pd
 
# Datos de ejemplo
data = {'Producto': ['Manzanas', 'Naranjas', 'Bananas', 'Manzanas', 'Bananas', 'Bananas'],
        'Persona de Ventas': ['Juan', 'Juan', 'Clara', 'Clara', 'Juan', 'Clara'],
        'Unidades': [5, 3, 8, 7, 2, 4]}
df = pd.DataFrame(data)
 
# Usar crosstab con agregación
tabla = pd.crosstab(df['Persona de Ventas'], df['Producto'], values=df['Unidades'], aggfunc='sum')
print(tabla)

En este ejemplo, el crosstab muestra el total de unidades de cada tipo de producto vendido por cada persona de ventas. Esta es una forma poderosa de resumir y visualizar tus datos.

Cómo Ordenar un Crosstab en Pandas

Ordenar un crosstab en pandas es tan simple como usar la función sort_values. Puedes ordenar por una columna específica o por el índice. Aquí tienes un ejemplo:

# Continuando desde el ejemplo anterior
# Ordenar por 'Manzanas'
tabla = tabla.sort_values('Manzanas', ascending=False)
print(tabla)

En este ejemplo, el crosstab se ordena por la columna 'Manzanas' en orden descendente. Puedes cambiar fácilmente esto para ordenar por una columna diferente o en orden ascendente.

Conteo y Porcentaje en un Crosstab de Pandas

A veces, es posible que desees obtener tanto el conteo como el porcentaje en tu crosstab. Esto se puede lograr creando dos crosstabs y concatenándolos. Así se hace:

# Continuando desde el primer ejemplo
# Crear crosstab de conteo
tabla_conteo = pd.crosstab(df['Persona de Ventas'], df['Producto'])
 
# Crear crosstab de porcentaje
tabla_porcentaje = pd.crosstab(df['Persona de Ventas'], df['Producto'], normalize='index')
 
# Concatenar las dos tablas
tabla_final = pd.concat([tabla_conteo, tabla_porcentaje], keys=['Conteo', 'Porcentaje'])
print(tabla_final)

En este ejemplo, el crosstab final muestra tanto el conteo como el porcentaje de cada categoría. Esto puede ser muy útil para obtener una vista completa de tus datos.

Preguntas Frecuentes

¿Qué es crosstab en pandas?

Crosstab en pandas es una función en la biblioteca pandas de Python que te permite crear una tabla de contingencia de dos o más factores. Proporciona una forma sencilla y efectiva de entender las relaciones en tus datos.

¿Cómo se define crosstab en Python?

Definir un crosstab en Python utilizando pandas es bastante sencillo. La sintaxis básica para crear un crosstab es pd.crosstab(indice, columnas), donde indice y columnas son los valores por los que agrupar en las filas y columnas, respectivamente.

¿Cómo crear un crosstab con porcentajes en pandas?

Para crear un crosstab con porcentajes en pandas, necesitas establecer el parámetro normalize en True o especificar el eje (índice o columnas) que deseas normalizar. Esto creará un crosstab que muestra la proporción de cada categoría, proporcionando una imagen más clara de la distribución de las categorías.