Sélectionner des données dans un MultiIndex
Récupérez les données aux niveaux externe et interne de l’index avec .loc, des tuples, des tranches et l’outil pd.IndexSlice.
Sélectionner des données dans un MultiIndex est une leçon Pandas & NumPy Academy gratuite sur CoddyKit. Ceci est la leçon 2 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.
Parcourir des données hiérarchiques
Une fois que vous disposez d’un MultiIndex, vous avez besoin de moyens efficaces pour récupérer des sous-ensembles de données. Pandas fournit trois outils pour cela : .loc avec des tuples pour sélectionner des étiquettes exactes, slice() et pd.IndexSlice pour sélectionner des intervalles à travers les niveaux, et .xs() pour sélectionner une coupe transversale à une valeur précise d’un niveau. La maîtrise de ces modes d’accès permet d’exploiter pleinement la puissance de l’indexation hiérarchique.
import pandas as pd
import numpy as np
# Setup: GDP data by country and year
df_flat = pd.DataFrame({
'country': ['USA','USA','USA','UK','UK','UK','DE','DE','DE'],
'year': [2021, 2022, 2023, 2021, 2022, 2023, 2021, 2022, 2023],
'gdp_bn': [23000, 25000, 26000, 3000, 3100, 3200, 4100, 4200, 4350]
})
df = df_flat.set_index(['country', 'year']).sort_index()
print(df)Sélectionner selon le niveau externe avec .loc
Transmettez une seule étiquette du niveau externe à .loc[] pour récupérer toutes les lignes de ce groupe. Avec un MultiIndex à deux niveaux (pays, année), df.loc['USA'] renvoie toutes les lignes concernant les USA sous forme de DataFrame, en ne conservant que l’index interne (l’année). Ce comportement est appelé suppression de niveau : lorsque vous sélectionnez une valeur précise d’un niveau externe, Pandas supprime ce niveau de l’index de l’objet renvoyé.
import pandas as pd
df_flat = pd.DataFrame({
'country': ['USA','USA','USA','UK','UK','UK'],
'year': [2021, 2022, 2023, 2021, 2022, 2023],
'gdp_bn': [23000, 25000, 26000, 3000, 3100, 3200]
})
df = df_flat.set_index(['country', 'year']).sort_index()
# Select all USA rows
usa = df.loc['USA']
print('All USA rows:')
print(usa)
print('\nRemaining index type:', usa.index.name)Sélectionner un tuple précis avec .loc
Pour récupérer une seule ligne identifiée par les deux niveaux de l’index, transmettez un tuple à .loc[] : df.loc[('USA', 2022)]. Cela renvoie une Series (ou un scalaire pour une seule colonne) correspondant exactement à cette combinaison d’étiquettes (externe, interne). Vous devez placer le tuple dans une liste, df.loc[[('USA', 2022)]], si vous souhaitez obtenir un DataFrame plutôt qu’une Series.
import pandas as pd
df_flat = pd.DataFrame({
'country': ['USA','USA','USA','UK','UK','UK'],
'year': [2021, 2022, 2023, 2021, 2022, 2023],
'gdp_bn': [23000, 25000, 26000, 3000, 3100, 3200],
'cpi': [3.2, 5.1, 4.8, 2.5, 3.4, 3.0]
})
df = df_flat.set_index(['country', 'year']).sort_index()
# Single row as Series
print('USA 2022 (Series):')
print(df.loc[('USA', 2022)])
# Single row as DataFrame
print('\nUSA 2022 (DataFrame):')
print(df.loc[[('USA', 2022)]])Sélectionner plusieurs lignes avec une liste de tuples
Pour sélectionner plusieurs lignes précises en une seule fois, transmettez une liste de tuples à .loc[]. Cette méthode est utile lorsque vous avez besoin d’un sous-ensemble de lignes non contiguës identifiées par des clés composites — par exemple, les données de 2022 pour les USA et le UK, mais pas pour l’Allemagne. Le résultat conserve le MultiIndex dans le DataFrame renvoyé.
import pandas as pd
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]
})
df = df_flat.set_index(['country', 'year']).sort_index()
# Select specific (country, year) combinations
subset = df.loc[[('USA', 2022), ('UK', 2023), ('DE', 2022)]]
print(subset)Effectuer un découpage avec pd.IndexSlice
pd.IndexSlice (généralement associé à l’alias idx) vous permet d’écrire des tranches d’intervalles pour les niveaux d’un MultiIndex sans construire manuellement des tranches de tuples verbeuses. Syntaxe : df.loc[idx[outer_slice, inner_slice], column_slice]. Par exemple, df.loc[idx['UK':'USA', 2022:2023], :] sélectionne toutes les lignes dont le niveau externe est compris entre UK et USA et le niveau interne entre 2022 et 2023. L’index doit être trié pour que cela fonctionne correctement.
import pandas as pd
import numpy as np
years = [2021, 2022, 2023]
countries = ['DE', 'UK', 'USA']
mi = pd.MultiIndex.from_product([countries, years], names=['country', 'year'])
df = pd.DataFrame({'gdp': np.random.randint(3000, 26000, 9)}, index=mi)
idx = pd.IndexSlice
# Select UK and USA for years 2022 and 2023
subset = df.loc[idx['UK':'USA', 2022:2023], :]
print(subset)Accéder à une coupe transversale avec .xs()
df.xs(key, level=) sélectionne toutes les lignes pour lesquelles un niveau précis est égal à une valeur donnée, quels que soient les contenus des autres niveaux. Contrairement à .loc, qui exige de spécifier d’abord les niveaux externes, .xs peut accéder directement à n’importe quel niveau par son nom. Par exemple, df.xs(2022, level='year') renvoie toutes les lignes de 2022 pour tous les pays, sans avoir besoin de spécifier 'USA', 'UK' ou 'DE'.
import pandas as pd
import numpy as np
countries = ['DE', 'UK', 'USA']
years = [2021, 2022, 2023]
mi = pd.MultiIndex.from_product([countries, years], names=['country', 'year'])
df = pd.DataFrame({'gdp': [4100,4200,4350, 3000,3100,3200, 23000,25000,26000]}, index=mi)
# All countries for year 2022 (inner level)
print('All data for year 2022:')
print(df.xs(2022, level='year'))
# All years for UK (outer level)
print('\nAll years for UK:')
print(df.xs('UK', level='country'))Accéder aux colonnes d’un MultiIndex
Lorsqu’un DataFrame possède un MultiIndex sur ses colonnes, utilisez des tuples pour accéder à des colonnes précises : df[('revenue', 'Q1')]. Pour sélectionner toutes les colonnes d’un niveau externe (par exemple, toutes les colonnes de revenus), utilisez df['revenue'], qui renvoie un DataFrame contenant toutes les colonnes du niveau interne sous cette clé externe. Le schéma pd.IndexSlice fonctionne également sur les multi-index de colonnes lorsqu’il est combiné avec .loc.
import pandas as pd
import numpy as np
metrics = ['revenue', 'cost']
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
cols = pd.MultiIndex.from_product([metrics, quarters], names=['metric', 'quarter'])
df = pd.DataFrame(
np.random.randint(50, 200, (3, 8)),
columns=cols,
index=['USA', 'UK', 'DE']
)
# Access all revenue columns
print('Revenue columns:')
print(df['revenue'])
# Access a specific cell
print('\nUSA revenue Q1:', df.loc['USA', ('revenue', 'Q1')])Sélectionner un niveau interne pour toutes les clés externes
Pour sélectionner une seule valeur du niveau interne pour toutes les valeurs du niveau externe, combinez .loc avec un slice(None) pour le niveau externe : df.loc[(slice(None), 2022), :]. Cela sélectionne la ligne de 2022 pour chaque pays. La version avec pd.IndexSlice est plus lisible : df.loc[idx[:, 2022], :]. Ce schéma est souvent nécessaire lorsque vous souhaitez obtenir un instantané de toutes les entités à un moment précis.
import pandas as pd
import numpy as np
countries = ['DE', 'UK', 'USA']
years = [2021, 2022, 2023]
mi = pd.MultiIndex.from_product([countries, years], names=['country', 'year'])
df = pd.DataFrame({'gdp': [4100,4200,4350, 3000,3100,3200, 23000,25000,26000]}, index=mi)
idx = pd.IndexSlice
# All countries for year 2022 (using IndexSlice)
all_2022 = df.loc[idx[:, 2022], :]
print('All countries in 2022:')
print(all_2022)Pièges courants lors de la sélection dans un MultiIndex
Voici trois pièges courants : 1) Index non trié : découper un MultiIndex qui n’est pas trié déclenche UnsortedIndexError ou renvoie des résultats incorrects — appelez toujours sort_index() au préalable. 2) KeyError avec un tuple comme clé : si vous transmettez un tuple sans l’encapsuler dans .loc[], Python l’interprète comme une indexation positionnelle — utilisez toujours .loc pour accéder à un MultiIndex par étiquettes. 3) Incompatibilité des niveaux : après groupby, les noms des niveaux du MultiIndex peuvent ne pas correspondre à vos attentes — vérifiez df.index.names avant d’effectuer un découpage.
import pandas as pd
# Unsorted MultiIndex slicing
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)
# Sort before slicing
df = df.sort_index()
print('After sort:', df.index.is_monotonic_increasing)
idx = pd.IndexSlice
print('\nSlice A:')
print(df.loc[idx['A', :], :])Exemple pratique : rapport trimestriel
Cas d’utilisation concret : vos données de ventes sont indexées par (région, trimestre) et vous devez extraire le quatrième trimestre pour toutes les régions dans un rapport de fin d’année. Utilisez .xs('Q4', level='quarter') pour obtenir cette coupe transversale en un seul appel. Calculez ensuite le total avec .sum(). Ce schéma — agrégation avec groupby → résultat MultiIndex → extraction d’une coupe transversale — est extrêmement courant dans les flux de production de rapports d’entreprise.
import pandas as pd
import numpy as np
regions = ['North', 'South', 'East', 'West']
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
mi = pd.MultiIndex.from_product([regions, quarters], names=['region', 'quarter'])
np.random.seed(42)
df = pd.DataFrame({
'sales': np.random.randint(200, 500, 16),
'units': np.random.randint(50, 150, 16)
}, index=mi)
# Extract Q4 performance across all regions
q4 = df.xs('Q4', level='quarter')
print('Q4 Results by Region:')
print(q4)
print('\nQ4 Total Sales:', q4['sales'].sum())Combiner la sélection d’un MultiIndex avec des colonnes
Vous pouvez sélectionner simultanément des lignes et des colonnes précises avec .loc[row_indexer, column_list]. Avec un MultiIndex, l’indexeur de lignes peut être un tuple, une liste de tuples ou un IndexSlice, tandis que l’indexeur de colonnes peut être un nom de colonne ou une liste de noms. Vous pouvez ainsi extraire un sous-tableau rectangulaire précis d’un DataFrame hiérarchique en une seule expression.
import pandas as pd
import numpy as np
countries = ['DE', 'UK', 'USA']
years = [2021, 2022, 2023]
mi = pd.MultiIndex.from_product([countries, years], names=['country', 'year'])
df = pd.DataFrame({
'gdp': [4100,4200,4350, 3000,3100,3200, 23000,25000,26000],
'inflation': [1.5, 2.1, 2.8, 2.0, 3.4, 2.9, 3.2, 5.1, 4.8],
'unemployment': [5.0, 4.8, 4.5, 4.5, 4.2, 4.0, 3.8, 3.5, 3.3]
}, index=mi)
idx = pd.IndexSlice
# UK and USA, years 2022-2023, only gdp and inflation
result = df.loc[idx['UK':'USA', 2022:2023], ['gdp', 'inflation']]
print(result)Vérification rapide
Testez votre compréhension de la sélection dans un MultiIndex à partir de cette leçon.
Récapitulatif de la leçon
Dans cette leçon, vous avez appris à utiliser .loc avec des tuples pour sélectionner des combinaisons précises d’étiquettes (externe, interne), pd.IndexSlice pour effectuer des tranches d’intervalles sur n’importe quels niveaux, et .xs() pour extraire une coupe transversale à n’importe quel niveau, indépendamment des clés externes. Triez toujours l’index au préalable pour éviter UnsortedIndexError. Nous allons maintenant voir l’alignement des index et le réindexage : la manière dont Pandas aligne deux DataFrames sur un index commun.
Questions Fréquemment Posées
La leçon « Sélectionner des données dans un MultiIndex » est-elle gratuite ?
Oui — le texte complet de « Sélectionner des données dans 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 « Sélectionner des données dans un MultiIndex » ?
Récupérez les données aux niveaux externe et interne de l’index avec .loc, des tuples, des tranches et l’outil pd.IndexSlice. 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 2 sur 4.
Combien de temps prend la leçon « Sélectionner des données dans 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
- Créer un MultiIndex
- Sélectionner des données dans un MultiIndex
- Alignement et réindexation
- Avantages des index triés en matière de performances