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

import pandas as pd

# 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

import pandas as pd

# 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

import pandas as pd

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

import pandas as pd

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

import pandas as pd

# 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

import pandas as pd

# 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 pandas as pd
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}%")

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

Autres extensions