MultiIndex de Pandas
MultiIndex est une fonctionnalité d'indexation puissante dans Pandas qui permet de créer des structures hiérarchiques à plusieurs niveaux sur les lignes ou les colonnes. Cela est particulièrement utile pour traiter des données de grande dimension, des statistiques de groupe et des données de panel.
Création d'un MultiIndex
Création à partir d'une liste
Exemple
# Méthode 1 : Création à l'aide de tableaux
arrays = [
["A", "A", "B", "B", "C", "C"],
[1, 2, 1, 2, 1, 2]
]
# Utilisation de pd.MultiIndex.from_arrays
index = pd.MultiIndex.from_arrays(arrays, names=["Catégorie", "Nombre"])
print("Créé à partir de tableaux :")
print(index)
print()
# Méthode 2 : Utilisation d'une liste de tuples
tuples = [
("A", 1), ("A", 2), ("B", 1), ("B", 2), ("C", 1), ("C", 2)
]
index = pd.MultiIndex.from_tuples(tuples, names=["Catégorie", "Nombre"])
print("Créé à partir de tuples :")
print(index)
print()
# Méthode 3 : Utilisation du produit
index = pd.MultiIndex.from_product(
[["A", "B", "C"], [1, 2, 3]],
names=["Catégorie", "Nombre"]
)
print("Créé à partir du produit:")
print(index)
Création d'un DataFrame avec MultiIndex
Exemple
import numpy as np
# Création d'un DataFrame avec MultiIndex
df = pd.DataFrame(
np.random.randn(6, 4),
index=pd.MultiIndex.from_tuples(
[("2024", "Q1"), ("2024", "Q2"), ("2024", "Q3"),
("2025", "Q1"), ("2025", "Q2"), ("2025", "Q3")]
),
columns=["Pékin", "Shanghai", "Guangzhou", "Shenzhen"]
)
df.index.names = ["Année", "Trimestre"]
print("DataFrame avec MultiIndex:")
print(df)
Accès à MultiIndex
Accès avec loc/iloc
Exemple
# Création de données d'exemple
df = pd.DataFrame({
"Chinois": [85, 92, 78, 88],
"Mathématiques": [90, 88, 95, 82]
}, index=pd.MultiIndex.from_tuples(
[("Niveau 10", "Classe A"), ("Niveau 10", "Classe B"), ("11e année", "Classe A"), ("11e année", "Classe B")],
names=["Niveau", "Classe"]
))
print("Données d'origine :")
print(df)
print()
# Accéder à l'index externe
print("Accès à tous les Grade 10 :")
print(df.loc["Grade 10"])
print()
# Accéder à l'index interne
print("Accès à Class A :")
print(df.loc[:, "Class A"])
print()
# Accéder à plusieurs niveaux d'index
print("Accès à Class A de Grade 10 :")
print(df.loc[("Grade 10", "Class A")])
Accès avec xs
Exemple
# Création de données d'exemple
df = pd.DataFrame({
"Chinois": [85, 92, 78, 88],
"Mathématiques": [90, 88, 95, 82]
}, index=pd.MultiIndex.from_tuples(
[("Niveau 10", "Classe A"), ("Niveau 10", "Classe B"), ("11e année", "Classe A"), ("11e année", "Classe B")],
names=["Niveau", "Classe"]
))
# Utiliser xs pour accéder aux valeurs à un niveau spécifique
print("Accès à Grade 10 avec xs :")
print(df.xs("Grade 10", level="Grade"))
print()
print("Accès à la classe A avec xs :")
print(df.xs("Class A", level="Class"))
Conversion de MultiIndex
Empilement et désempilement
Exemple
import numpy as np
# Création d'un DataFrame au format large
df = pd.DataFrame(
np.arange(12).reshape(3, 4),
index=pd.MultiIndex.from_tuples(
[("Beijing", "2024"), ("Shanghai", "2024"), ("Guangzhou", "2024")]
),
columns=pd.MultiIndex.from_tuples(
[("Q1", "Revenue"), ("Q1", "Profit"), ("Q2", "Revenue"), ("Q2", "Profit")]
)
)
print("Données d'origine (colonnes imbriquées) :")
print(df)
print()
# unstack : convertir l'index interne en colonnes
df_unstacked = df.unstack()
print("Après unstack :")
print(df_unstacked)
print()
# stack : Convertir les colonnes en index interne
df_stacked = df_unstacked.stack()
print("Après stack :")
print(df_stacked)
Tri d'un MultiIndex
Exemple
# Création d'un DataFrame avec un index non trié
df = pd.DataFrame({
"Value": [1, 2, 3, 4, 5, 6]
}, index=pd.MultiIndex.from_tuples(
[("C", 2), ("A", 1), ("B", 2), ("A", 2), ("C", 1), ("B", 1)],
names=["Lettre", "Nombre"]
))
print("Données non triées :")
print(df)
print()
# Trier par niveau externe
df_sorted1 = df.sort_index()
print("Après tri par niveau externe :")
print(df_sorted1)
print()
# Trier par niveau interne
df_sorted2 = df.sort_index(level=1)
print("Après tri par niveau interne :")
print(df_sorted2)
print()
# Trier par plusieurs niveaux
df_sorted3 = df.sort_index(level=[0, 1])
print("Après tri par plusieurs niveaux :")
print(df_sorted3)
Pratique : statistiques de groupe
MultiIndex est très adapté aux statistiques de groupe et à l'analyse pivot.
Exemple
import numpy as np
# Création de données de ventes
np.random.seed(42)
df = pd.DataFrame({
"Year": ["2023"] * 6 + ["2024"] * 6,
"Quarter": ["Q1", "Q2", "Q3", "Q4"] * 3,
"Produit": ["Téléphone", "Téléphone", "Ordinateur", "Ordinateur"] * 3,
"Région": ["Chine de l'Est", "Chine du Sud", "Chine du Nord"] * 4,
"Montant des ventes": np.random.randint(100, 500, 12)
})
print("Données de ventes d'origine :")
print(df)
print()
# Définition d'un MultiIndex et exécution de statistiques groupées
df_grouped = df.set_index(["Année", "Trimestre", "Produit", "Région"])
print("Groupé par année, trimestre, produit, région :")
print(df_grouped)
# Résumer par année
yearly = df_grouped.groupby(level="Année").sum()
print("\n"Ventes annuelles :")
print(yearly)
# Résumer par année et trimestre
quarterly = df_grouped.groupby(level=["Year", "Quarter"]).sum()
print("\n"Ventes trimestrielles :")
print(quarterly)
Problèmes courants et notes
1. Confusion des niveaux d'index
Faites attention lorsque vous manipulez des données afin d'éviter de confondre les niveaux. Il est recommandé de vérifier avant et après les opérations.df.index.names。
2. Erreurs d'accès à l'index
locUtilisez l'accès par étiquette,ilocUtilisez l'accès par position ; ne mélangez pas les deux.
3. Index dupliqué lors de l'utilisation de concat
Lors de l'utilisationconcatpour fusionner des données, des index dupliqués peuvent entraîner des résultats inattendus. Vous pouvez utiliserignore_index=Truepour réinitialiser.
Autres extensionsMultiIndex est une fonctionnalité essentielle de Pandas pour la gestion de données de grande dimension. Une utilisation appropriée de MultiIndex peut rendre l'organisation des données plus claire et les statistiques plus pratiques.