Tipo categórico de Pandas (Categorical)

Categorical es un tipo de datos en Pandas utilizado para manejar valores categóricos limitados, especialmente adecuado para procesar datos de tipo enumerado, como género, nivel educativo, grado, etc. El tipo categórico puede reducir significativamente la ocupación de memoria y mejorar el rendimiento computacional.


Crear datos Categorical

Crear desde Series

Ejemplo

import pandas as pd

# Crear datos categóricos
s = pd.Series(["Hombre", "Mujer", "Hombre", "Mujer", "Hombre"], dtype="category")
print("Datos categóricos básicos:")
print(s)
print(f"Tipo: {s.dtype}")
print()

# Especificar el orden de las categorías
s2 = pd.Series(
    ["Bajo", "Medio", "Alto", "Medio", "Bajo"],
    dtype=pd.CategoricalDtype(categories=["Bajo", "Medio", "Alto"], ordered=True)
)
print("Categorías ordenadas:")
print(s2)
print(f"Orden de categorías: {s2.dtype.categories.tolist()}")

Crear desde lista

Ejemplo

import pandas as pd

# Usar pd.Categorical
categories = pd.Categorical(
    ["A", "B", "A", "C", "B"],
    categories=["A", "B", "C"]
)

s = pd.Series(categories)
print("Crear desde Categorical:")
print(s)

Atributos y métodos de categorías

Acceder a la información de categorías

Ejemplo

import pandas as pd

s = pd.Series(
    ["Bajo", "Medio", "Alto", "Medio", "Bajo"],
    dtype=pd.CategoricalDtype(categories=["Bajo", "Medio", "Alto"], ordered=True)
)

# Atributos de categorías
print(f"Categorías: {s.dtype.categories.tolist()}")
print(f"¿Está ordenado?: {s.dtype.ordered}")
print()

# Contar el número de cada categoría
print("Estadísticas de categorías:")
print(s.value_counts())

Modificar categorías

Ejemplo

import pandas as pd

s = pd.Series(["A", "B", "C", "A", "B"], dtype="category")

print("Modificar nombres de categorías:")
s2 = s.cat.rename_categories({"A": "Excelente", "B": "Bien", "C": "Aprobado"})
print(s2)
print()

# Añadir nueva categoría
print("Añadir categoría:")
s3 = s.cat.add_categories(["D"])
print(s3.dtype.categories.tolist())
print()

# Eliminar categoría
print("Eliminar categoría:")
s4 = s.cat.remove_categories(["C"])
print(s4.dtype.categories.tolist())

Categorías ordenadas

Las categorías ordenadas admiten operaciones de comparación y son adecuadas para datos categóricos que tienen un orden.

Ejemplo

import pandas as pd

# Crear categorías ordenadas
s = pd.Series(
    ["Bajo", "Medio", "Alto", "Alto", "Bajo", "Medio"],
    dtype=pd.CategoricalDtype(categories=["Bajo", "Medio", "Alto"], ordered=True)
)

# Operaciones de comparación
print("Alto > Medio:", s > "Medio")
print("Medio > Bajo:", s > "Bajo")
print()

# Ordenar
print("Después de ordenar:")
print(s.sort_values())

Práctica: Agrupación de datos

Ejemplo

import pandas as pd

# Simular datos de nivel de usuario
users = pd.DataFrame({
    "ID de usuario": range(1, 1001),
    "Nivel": pd.Categorical(
        ["VIP"] * 100 + ["Oro"] * 300 + ["Plata"] * 400 + ["Normal"] * 200,
        categories=["Normal", "Plata", "Oro", "VIP"],
        ordered=True
    ),
    "Monto de consumo": [1000, 500, 100, 50] * 250
})

print("Distribución de niveles de usuario:")
print(users["Nivel"].value_counts().sort_index())
print()

# Estadísticas agrupadas por nivel
print("Estadísticas por nivel:")
print(users.groupby("Nivel", observed=True)["Monto de consumo"].sum())

Optimización de memoria

El tipo categórico puede reducir en gran medida el uso de memoria de los datos de cadena.

Ejemplo

import pandas as pd
import numpy as np

# Crear muchos datos de cadena repetidos
np.random.seed(42)
s_str = pd.Series(np.random.choice(["Pekín", "Shanghái", "Cantón", "Shenzhen"], 1000000))

# Convertir al tipo categórico
s_cat = s_str.astype("category")

# Comparación de memoria
print(f"Memoria del tipo cadena: {s_str.memory_usage(deep=True) / 1024 / 1024:.2f} MB")
print(f"Memoria del tipo categórico: {s_cat.memory_usage(deep=True) / 1024 / 1024:.2f} MB")
print(f"Ahorro: {(1 - s_cat.memory_usage(deep=True) / s_str.memory_usage(deep=True)) * 100:.1f}%")

Cuando los datos contienen una gran cantidad de valores de cadena repetidos, el uso del tipo categórico puede reducir significativamente la ocupación de memoria, siendo especialmente adecuado para conjuntos de datos grandes.

Otras extensiones