Pandas & NumPy Academy · Leçon

Créer un MultiIndex

Créez un index de lignes hiérarchique avec pd.MultiIndex.from_tuples ou set_index sur plusieurs colonnes, puis examinez ses niveaux.

Leçon 1 sur 413 étapes

Créer un MultiIndex est une leçon Pandas & NumPy Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Pandas & NumPy Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Pandas & NumPy Academy comprend 4 leçons au total.

Qu’est-ce qu’un MultiIndex ?

Un MultiIndex (également appelé index hiérarchique) permet à un DataFrame ou à une Series Pandas de posséder plusieurs niveaux d’étiquettes de lignes. Considérez-le comme une clé composite dans une base de données : au lieu d’identifier une ligne par une seule étiquette, vous l’identifiez par un tuple tel que (pays, ville) ou (année, trimestre). Les MultiIndexes sont indispensables pour représenter des données de panel, des séries temporelles transversales et tout jeu de données présentant naturellement une structure de regroupement à deux niveaux.

import pandas as pd

# A simple example: sales by country and city
data = {
    'sales': [100, 200, 150, 300, 80, 120]
}
index = pd.MultiIndex.from_tuples(
    [('USA', 'New York'), ('USA', 'Chicago'),
     ('UK', 'London'), ('UK', 'Manchester'),
     ('DE', 'Berlin'), ('DE', 'Munich')],
    names=['country', 'city']
)
df = pd.DataFrame(data, index=index)
print(df)

Créer un MultiIndex avec from_tuples

pd.MultiIndex.from_tuples(list_of_tuples, names=) est la manière la plus explicite de créer un MultiIndex. Chaque tuple devient une étiquette de ligne et ses éléments deviennent les niveaux. Le paramètre names attribue une étiquette à chaque niveau (par exemple ['year', 'quarter']). Cette méthode est utile lorsque vous disposez d’une liste prédéfinie de clés composites que vous souhaitez utiliser comme index de lignes.

import pandas as pd

# Multi-level time index: year x quarter
tuples = [
    (2022, 'Q1'), (2022, 'Q2'), (2022, 'Q3'), (2022, 'Q4'),
    (2023, 'Q1'), (2023, 'Q2'), (2023, 'Q3'), (2023, 'Q4')
]
mi = pd.MultiIndex.from_tuples(tuples, names=['year', 'quarter'])
revenue = [120, 135, 145, 160, 130, 148, 162, 175]
df = pd.Series(revenue, index=mi, name='revenue_M')
print(df)

Créer un MultiIndex avec from_product

pd.MultiIndex.from_product(iterables, names=) crée un MultiIndex à partir du produit cartésien de plusieurs listes — c’est-à-dire de toutes les combinaisons d’éléments des listes d’entrée. Il s’agit de la méthode la plus pratique lorsque toutes les combinaisons de niveaux doivent exister dans vos données. Par exemple, toutes les combinaisons de 3 années × 4 trimestres × 5 régions créent automatiquement un panel équilibré de 60 lignes.

import pandas as pd
import numpy as np

years = [2021, 2022, 2023]
quarters = ['Q1', 'Q2', 'Q3', 'Q4']

# Cartesian product: 3 years x 4 quarters = 12 combinations
mi = pd.MultiIndex.from_product([years, quarters], names=['year', 'quarter'])
print('Number of index entries:', len(mi))
print('First 6 entries:', mi[:6].tolist())

# Create a DataFrame with this index
df = pd.DataFrame({'revenue': np.random.randint(100, 200, 12)}, index=mi)
print('\n', df.head())

Créer un MultiIndex avec set_index

En pratique, la manière la plus courante de créer un MultiIndex consiste à partir d’un DataFrame ordinaire contenant des colonnes de regroupement, puis à appeler df.set_index([col1, col2]). Cette opération transforme ces colonnes de données en niveaux d’index. Le résultat est identique à celui obtenu en construisant l’index à partir de zéro avec from_tuples, mais elle ne nécessite qu’une seule ligne à partir de données tabulaires.

import pandas as pd

# Start with a flat DataFrame
df_flat = pd.DataFrame({
    'country': ['USA', 'USA', 'UK', 'UK', 'DE', 'DE'],
    'year': [2022, 2023, 2022, 2023, 2022, 2023],
    'gdp_bn': [25000, 26000, 3100, 3200, 4200, 4350]
})

# Promote two columns to a MultiIndex
df = df_flat.set_index(['country', 'year'])
print(df)
print('\nIndex type:', type(df.index).__name__)
print('Index names:', df.index.names)

Inspecter les niveaux d’un MultiIndex

Un MultiIndex stocke ses données dans des niveaux (les valeurs uniques de chaque niveau) et des codes (des pointeurs entiers vers les tableaux de niveaux). Inspectez les niveaux avec df.index.levels ou df.index.get_level_values(level). Utilisez df.index.nlevels pour vérifier le nombre de niveaux existants. L’attribut names répertorie le nom attribué à chaque niveau — définissez ces noms avec df.index.set_names(['level0', 'level1']).

import pandas as pd

df_flat = pd.DataFrame({
    'country': ['USA', 'USA', 'UK', 'UK'],
    'year': [2022, 2023, 2022, 2023],
    'gdp': [25000, 26000, 3100, 3200]
})
df = df_flat.set_index(['country', 'year'])

print('Number of levels:', df.index.nlevels)
print('Level names:', df.index.names)
print('Level 0 values:', df.index.get_level_values(0).tolist())
print('Level 1 values:', df.index.get_level_values(1).tolist())
print('Unique level 0:', df.index.get_level_values('country').unique().tolist())

MultiIndex sur les colonnes

Un MultiIndex peut également être appliqué aux colonnes, créant ainsi une hiérarchie d’étiquettes de colonnes. Cette organisation est courante lorsque vous stockez plusieurs métriques pour chaque catégorie dans une présentation de type tableau croisé — par exemple, (revenu, T1), (revenu, T2), (coût, T1), (coût, T2). Accédez aux colonnes dotées d’un MultiIndex de la même manière qu’aux lignes — en utilisant des tuples. Créez un MultiIndex de colonnes avec pd.MultiIndex.from_product et affectez-le à df.columns.

import pandas as pd
import numpy as np

# Create a DataFrame with MultiIndex columns
metrics = ['revenue', 'cost']
quarters = ['Q1', 'Q2', 'Q3', 'Q4']

col_index = pd.MultiIndex.from_product([metrics, quarters], names=['metric', 'quarter'])
data = np.random.randint(50, 200, size=(3, 8))
df = pd.DataFrame(data, columns=col_index, index=['USA', 'UK', 'DE'])
df.index.name = 'country'
print(df)

MultiIndex après une agrégation avec GroupBy

Lorsque vous appelez groupby([col1, col2]).agg(...), le DataFrame obtenu possède un MultiIndex sur ses lignes (les deux clés de groupby deviennent les deux niveaux de l’index) et éventuellement un MultiIndex sur ses colonnes (si vous agrégez plusieurs métriques). C’est la manière la plus courante de rencontrer un MultiIndex dans l’analyse de données quotidienne — comprendre comment le parcourir est essentiel pour travailler avec les résultats de groupby.

import pandas as pd
import seaborn as sns

tips = sns.load_dataset('tips')

# Two-key groupby creates a MultiIndex on rows
result = tips.groupby(['day', 'time'])['total_bill'].agg(['mean', 'count'])
print(result)
print('\nIndex type:', type(result.index).__name__)
print('Index names:', result.index.names)

Échanger et réordonner les niveaux

Utilisez df.swaplevel() pour échanger deux niveaux d’index, et df.reorder_levels([...]) pour modifier l’ordre de tous les niveaux. Le réordonnancement est utile lorsque vous souhaitez effectuer une sélection en commençant par un niveau interne, ou lorsque deux DataFrames ont leurs niveaux d’index dans un ordre différent et doivent être alignés avant une fusion. Après le réordonnancement, appelez toujours sort_index() pour rétablir l’ordre lexicographique et permettre une sélection efficace.

import pandas as pd
import seaborn as sns

tips = sns.load_dataset('tips')
result = tips.groupby(['day', 'time'])['total_bill'].mean()
print('Original levels:', result.index.names)

# Swap so time is the outer level
swapped = result.swaplevel().sort_index()
print('\nSwapped levels:', swapped.index.names)
print(swapped.head())

Vérifier et trier un MultiIndex

La sélection dans un MultiIndex n’est efficace que lorsque l’index est trié par ordre lexicographique. Vérifiez si l’index est trié avec df.index.is_monotonic_increasing. Si le résultat est False, effectuez le tri avec df.sort_index(). Un MultiIndex non trié déclenche un PerformanceWarning lors des opérations de sélection par tranche et peut renvoyer des résultats incorrects dans certains cas particuliers — effectuez toujours le tri après avoir créé ou modifié un MultiIndex.

import pandas as pd

# Create an unsorted MultiIndex deliberately
tuples = [('B', 2), ('A', 1), ('B', 1), ('A', 2)]
mi = pd.MultiIndex.from_tuples(tuples, names=['letter', 'num'])
df = pd.DataFrame({'value': [10, 20, 30, 40]}, index=mi)

print('Is sorted:', df.index.is_monotonic_increasing)
print('Before sorting:')
print(df)

df_sorted = df.sort_index()
print('\nAfter sorting:')
print(df_sorted)
print('Is sorted:', df_sorted.index.is_monotonic_increasing)

Réinitialiser un MultiIndex en colonnes

Appelez df.reset_index() pour reconvertir tous les niveaux d’index en colonnes ordinaires, en laissant au DataFrame un simple RangeIndex entier. Il s’agit d’un schéma courant après des agrégations avec groupby : calculez le résumé groupé avec un MultiIndex, puis réinitialisez l’index pour obtenir un DataFrame aplati, adapté aux opérations Pandas ultérieures, aux fusions ou à l’exportation vers un fichier CSV. Utilisez reset_index(level='name') pour réinitialiser un seul niveau d’un index à deux niveaux.

import pandas as pd
import seaborn as sns

tips = sns.load_dataset('tips')
result = tips.groupby(['day', 'time'])['total_bill'].mean()
print('MultiIndex result:')
print(result.head(4))

# Flatten back to a regular DataFrame
flat = result.reset_index()
print('\nFlattened DataFrame:')
print(flat.head(4))
print('Index type:', type(flat.index).__name__)

Quand utiliser un MultiIndex

Utilisez un MultiIndex lorsque vos données présentent une structure hiérarchique naturelle : séries temporelles avec une granularité inférieure à la journée (date + heure), données en panel (entité + période), ou regroupements imbriqués (pays + région + ville). Évitez les MultiIndexes pour de simples clés de regroupement à deux colonnes lorsqu’un DataFrame aplati avec des colonnes séparées est tout aussi lisible. Si vous devez constamment appeler reset_index() simplement pour accéder aux données, cela indique probablement que le MultiIndex n’apporte pas de réelle valeur dans votre flux de travail.

Vérification rapide

Testez votre compréhension de la création d’un MultiIndex à partir de cette leçon.

Récapitulatif de la leçon

Dans cette leçon, vous avez appris que les MultiIndexes fournissent des étiquettes hiérarchiques de lignes (ou de colonnes) à l’aide de tuples. Ils peuvent être créés avec from_tuples, from_product ou set_index appliqué à plusieurs colonnes, et doivent toujours être triés pour permettre un découpage efficace. Nous allons maintenant voir comment sélectionner des données dans un MultiIndex à l’aide de .loc, de tuples, de tranches et de l’outil IndexSlice.

Gratuit pour commencer

Apprends Python avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
30
Leçons
120

Questions Fréquemment Posées

La leçon « Créer un MultiIndex » est-elle gratuite ?

Oui — le texte complet de « Créer un MultiIndex » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Pandas & NumPy Academy, passe à CoddyKit PRO. Le cours Pandas & NumPy Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Créer un MultiIndex » ?

Créez un index de lignes hiérarchique avec pd.MultiIndex.from_tuples ou set_index sur plusieurs colonnes, puis examinez ses niveaux. Tu pratiques Pandas & NumPy Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Pandas & NumPy Academy ?

Aucune expérience préalable n'est requise. Pandas & NumPy Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.

Combien de temps prend la leçon « Créer un MultiIndex » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Pandas & NumPy Academy ?

Oui. Chaque leçon Pandas & NumPy Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Créer un MultiIndex
  2. Sélectionner des données dans un MultiIndex
  3. Alignement et réindexation
  4. Avantages des index triés en matière de performances
← Retour à Pandas & NumPy Academy