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 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)
# 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())
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())
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())
# 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())
# 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}%")
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}%")
Otras extensionesCuando 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.