Type catégoriel Pandas
Categorical est un type de données dans Pandas utilisé pour gérer des valeurs catégorielles finies, particulièrement adapté au traitement de données énumérées telles que le sexe, l'éducation, le niveau, etc. Le type catégoriel peut réduire considérablement l'utilisation de la mémoire et améliorer les performances de calcul.
Création de données catégorielles
Création à partir d'une Series
Exemple
# Créer des données catégorielles
s = pd.Series(["Male", "Female", "Male", "Female", "Male"], dtype="category")
print("Données catégorielles de base :")
print(s)
print(f"Type : {s.dtype}")
print()
# Spécifier l'ordre des catégories
s2 = pd.Series(
["Low", "Medium", "High", "Medium", "Low"],
dtype=pd.CategoricalDtype(categories=["Low", "Moyen", "Élevé"], ordered=True)
)
print("Catégories ordonnées :")
print(s2)
print(f"Ordre des catégories : {s2.dtype.categories.tolist()}")
Création à partir d'une liste
Exemple
# Utiliser pd.Categorical
categories = pd.Categorical(
["A", "B", "A", "C", "B"],
categories=["A", "B", "C"]
)
s = pd.Series(categories)
print("Création à partir de Categorical :")
print(s)
Attributs et méthodes de catégorie
Accès aux informations sur les catégories
Exemple
s = pd.Series(
["Low", "Medium", "High", "Medium", "Low"],
dtype=pd.CategoricalDtype(categories=["Low", "Moyen", "Élevé"], ordered=True)
)
# Attributs de catégorie
print(f"Catégories : {s.dtype.categories.tolist()}")
print(f"Ordonné : {s.dtype.ordered}")
print()
# Compter le nombre de chaque catégorie
print("Statistiques des catégories :")
print(s.value_counts())
Modification des catégories
Exemple
s = pd.Series(["A", "B", "C", "A", "B"], dtype="category")
print("Modifier les noms des catégories :")
s2 = s.cat.rename_categories({"A": "Excellent", "B": "Bien", "C": "Passable"})
print(s2)
print()
# Ajouter une nouvelle catégorie
print("Ajouter une catégorie :")
s3 = s.cat.add_categories(["D"])
print(s3.dtype.categories.tolist())
print()
# Supprimer la catégorie
print("Supprimer la catégorie :")
s4 = s.cat.remove_categories(["C"])
print(s4.dtype.categories.tolist())
Catégories ordonnées
Les catégories ordonnées prennent en charge les opérations de comparaison et conviennent aux données catégorielles présentant un ordre de taille.
Exemple
# Créer des catégories ordonnées
s = pd.Series(
["Faible", "Moyen", "Élevé", "Élevé", "Faible", "Moyen"],
dtype=pd.CategoricalDtype(categories=["Low", "Moyen", "Élevé"], ordered=True)
)
# Opérations de comparaison
print("Élevé > Moyen :", s > "Moyen")
print("Moyen > Faible :", s > "Faible")
print()
# Tri
print("Après le tri :")
print(s.sort_values())
Exercice : Regroupement de données
Exemple
# Simuler des données de niveau utilisateur
users = pd.DataFrame({
"User ID": range(1, 1001),
"Level": pd.Categorical(
["VIP"] * 100 + ["Carte Or"] * 300 + ["Carte Argent"] * 400 + ["Régulier"] * 200,
categories=["Régulier", "Carte Argent", "Carte Or", "VIP"],
ordered=True
),
"Consumption Amount": [1000, 500, 100, 50] * 250
})
print("Répartition des niveaux d'utilisateurs :")
print(users["Level"].value_counts().sort_index())
print()
# Regrouper les statistiques par niveau
print("Statistiques par niveau :")
print(users.groupby("Level", observed=True)["Consumption Amount"].sum())
Optimisation de la mémoire
Le type catégoriel peut considérablement réduire l'utilisation de la mémoire des données de type chaîne.
Exemple
import numpy as np
# Créer une grande quantité de données de chaînes répétées
np.random.seed(42)
s_str = pd.Series(np.random.choice(["Pékin", "Shanghai", "Guangzhou", "Shenzhen"], 1000000))
# Convertir en type catégoriel
s_cat = s_str.astype("category")
# Comparaison de mémoire
print(f"Mémoire du type chaîne : {s_str.memory_usage(deep=True) / 1024 / 1024:.2f} MB")
print(f"Mémoire du type catégoriel : {s_cat.memory_usage(deep=True) / 1024 / 1024:.2f} MB")
print(f"Économie : {(1 - s_cat.memory_usage(deep=True) / s_str.memory_usage(deep=True)) * 100:.1f}%")
Autres extensionsLorsque les données contiennent de nombreuses valeurs de chaîne répétées, l'utilisation du type catégoriel peut réduire considérablement l'utilisation de la mémoire, ce qui le rend particulièrement adapté aux grands jeux de données.