Trier par index
Réordonnez les lignes selon leur libellé d’index avec sort_index() et comprenez dans quels cas un index trié améliore les performances.
Trier par index 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.
Comprendre l’index du DataFrame
Chaque DataFrame Pandas possède un index de lignes — un ensemble de libellés servant à identifier et à accéder aux lignes. Par défaut, il s’agit d’un RangeIndex (0, 1, 2, …), mais vous pouvez le définir à partir de n’importe quelle colonne (dates, noms, identifiants) avec set_index(). Lorsque l’index a une signification (par exemple, un DatetimeIndex ou un identifiant client), le trier plutôt que trier selon les valeurs d’une colonne produit un résultat organisé de manière logique.
import pandas as pd
df = pd.DataFrame(
{'value': [10, 20, 30]},
index=['C', 'A', 'B'] # out-of-order alphabetic index
)
print(df)
# value
# C 10
# A 20
# B 30<code>sort_index()</code> — Ordre ascendant
DataFrame.sort_index() réordonne les lignes selon leur libellé d’index plutôt que selon les valeurs des colonnes. Par défaut, le tri est ascendant : dans l’ordre alphabétique pour les index de chaînes, numérique pour les index d’entiers et chronologique pour DatetimeIndex. C’est la méthode standard pour rétablir l’ordre naturel d’un jeu de données après une permutation ou après l’ajout d’enregistrements dans le désordre.
import pandas as pd
df = pd.DataFrame(
{'temp': [22.5, 19.0, 25.1, 18.3]},
index=pd.to_datetime(['2024-03-01', '2024-01-15', '2024-06-10', '2024-01-01'])
)
sorted_df = df.sort_index()
print(sorted_df)
# temp
# 2024-01-01 18.3
# 2024-01-15 19.0
# 2024-03-01 22.5
# 2024-06-10 25.1<code>sort_index()</code> — Ordre descendant
Transmettez ascending=False pour trier l’index de la valeur la plus grande (ou la plus récente) à la plus petite (ou la plus ancienne). Pour un DatetimeIndex, les observations les plus récentes sont ainsi placées en haut, ce qui est la présentation habituelle pour les données financières, les fichiers journaux et les flux d’événements dans lesquels l’événement le plus récent est le plus pertinent.
import pandas as pd
df = pd.DataFrame(
{'price': [100, 110, 105, 115]},
index=pd.to_datetime(['2024-01', '2024-02', '2024-03', '2024-04'])
)
# Most recent first
print(df.sort_index(ascending=False))
# price
# 2024-04-30 115
# 2024-03-31 105
# 2024-02-29 110
# 2024-01-31 100Trier les libellés de colonnes avec axis=1
Par défaut, sort_index() trie l’index des lignes (axis=0). Transmettez axis=1 pour trier à la place les libellés des colonnes dans l’ordre alphabétique. Cela est utile pour standardiser les DataFrames larges comportant de nombreuses colonnes, afin qu’elles apparaissent dans un ordre alphabétique prévisible et qu’il soit plus facile de trouver visuellement une colonne ou de comparer des DataFrames.
import pandas as pd
df = pd.DataFrame({
'zebra': [1], 'apple': [2], 'mango': [3], 'banana': [4]
})
print('Before:', df.columns.tolist())
# ['zebra', 'apple', 'mango', 'banana']
sorted_cols = df.sort_index(axis=1)
print('After:', sorted_cols.columns.tolist())
# ['apple', 'banana', 'mango', 'zebra']Quand un index trié est-il plus rapide ?
Pandas peut utiliser une recherche binaire pour les recherches de libellés lorsque l’index est trié (monotone). Un index trié rend les tranches .loc['2024-01':'2024-06'] exécutées en O(log n), au lieu de O(n). La méthode is_monotonic_increasing (ou is_monotonic_decreasing) renvoie un booléen indiquant si l’index est déjà trié. Trier un grand index avant d’effectuer plusieurs extractions par tranche constitue un coût initial intéressant.
import pandas as pd
import numpy as np
idx = pd.to_datetime(['2024-03-01', '2024-01-15', '2024-06-10'])
df = pd.DataFrame({'v': [1, 2, 3]}, index=idx)
print('Sorted?', df.index.is_monotonic_increasing) # False
df = df.sort_index()
print('Sorted?', df.index.is_monotonic_increasing) # True
# Now slicing is efficient
print(df.loc['2024-01':'2024-03'])<code>sort_index()</code> avec MultiIndex
Lorsqu’un DataFrame possède un MultiIndex (index de lignes hiérarchique), sort_index() trie par défaut tous les niveaux de la hiérarchie. Vous pouvez limiter le tri à certains niveaux avec le paramètre level. Un MultiIndex trié est nécessaire pour effectuer efficacement des extractions hiérarchiques avec .loc[(outer, inner), :].
import pandas as pd
arrays = [
['B', 'B', 'A', 'A'],
['two', 'one', 'two', 'one']
]
idx = pd.MultiIndex.from_arrays(arrays, names=['first', 'second'])
df = pd.DataFrame({'value': [10, 20, 30, 40]}, index=idx)
print(df.sort_index())
# value
# first second
# A one 40
# two 30
# B one 20
# two 10Trier un seul niveau d’un MultiIndex
Avec un MultiIndex, vous pouvez vouloir trier uniquement le niveau interne ou externe tout en conservant l’ordre de l’autre niveau. Transmettez level= à sort_index() — ce paramètre accepte un entier (position du niveau), une chaîne (nom du niveau) ou une liste. Cette possibilité est utile lorsque l’ordre du niveau externe est déjà correct et que vous devez seulement trier les éléments au sein de chaque groupe.
import pandas as pd
df = pd.DataFrame({
'sales': [300, 100, 200, 400, 150, 250]
}, index=pd.MultiIndex.from_tuples([
('Eng', 'Dave'), ('Eng', 'Alice'), ('Eng', 'Bob'),
('HR', 'Zoe'), ('HR', 'Carol'), ('HR', 'Eve')
], names=['dept', 'name']))
# Sort only the 'name' level alphabetically within each dept
print(df.sort_index(level='name'))
# sales
# dept name
# Eng Alice 100
# Bob 200
# Dave 300
# HR Carol 150
# Eve 250
# Zoe 400Différence entre sort_index() et sort_values()
Il est important de distinguer les deux méthodes de tri. sort_values(by='col') réorganise les lignes en fonction des valeurs des données d’une colonne. sort_index() réorganise les lignes en fonction de l’étiquette de ligne (l’index), qui peut correspondre ou non à une colonne. Lorsque l’index est l’identifiant principal (par exemple, un DatetimeIndex ou une clé textuelle significative), sort_index() est le choix approprié.
import pandas as pd
df = pd.DataFrame(
{'value': [30, 10, 20]},
index=['C', 'A', 'B']
)
# sort_index: sorted by row label A, B, C
print(df.sort_index())
# value
# A 10
# B 20
# C 30
# sort_values: sorted by data value 10, 20, 30
print(df.sort_values('value'))
# value
# A 10
# B 20
# C 30
# (same here because values happen to match alphabetical label order!)Rétablir l’ordre d’origine après des opérations
Certaines opérations (mélange, échantillonnage aléatoire avec df.sample(frac=1)) bouleversent l’ordre des lignes. sort_index() est la méthode simple pour rétablir l’ordre séquentiel d’origine. Si l’ordre d’origine était un RangeIndex (0, 1, 2, …), sort_index() le rétablit ; s’il s’agissait d’une étiquette significative, cette méthode rétablit l’ordre naturel de cette étiquette.
import pandas as pd
df = pd.DataFrame({'x': [10, 20, 30, 40, 50]})
# Shuffle (random sample)
shuffled = df.sample(frac=1, random_state=42)
print('Shuffled index:', shuffled.index.tolist())
# e.g. [2, 4, 0, 1, 3]
# Restore original order by sorting the index
restored = shuffled.sort_index()
print('Restored index:', restored.index.tolist())
# [0, 1, 2, 3, 4]sort_index() avec na_position
Comme sort_values(), sort_index() prend également en charge na_position pour contrôler l’emplacement des étiquettes d’index NaN. Cela est important lorsqu’un DataFrame possède un index textuel ou de dates contenant certaines étiquettes NaN (ce qui peut se produire après des opérations qui introduisent des valeurs d’index manquantes). La valeur par défaut est 'last'.
import pandas as pd
import numpy as np
df = pd.DataFrame(
{'v': [1, 2, 3, 4]},
index=['B', None, 'A', 'C']
)
print(df.sort_index(na_position='last'))
# v
# A 3
# B 1
# C 4
# NaN 2Mesurer le gain de performances
Vous pouvez mesurer empiriquement le gain de performances d’un index trié en utilisant timeit de Python pour comparer une sélection sur un DatetimeIndex non trié et sur un DatetimeIndex trié. Dans le cas trié, une recherche binaire est utilisée, ce qui est généralement 5 à 20 fois plus rapide pour les DataFrames volumineux. Cela montre pourquoi sort_index() n’est pas qu’une opération esthétique : elle a de véritables conséquences sur le temps d’exécution.
import pandas as pd
import numpy as np
np.random.seed(0)
random_dates = pd.to_datetime(
pd.Timestamp('2020-01-01').value + np.random.randint(0, 1_000_000_000_000_000, size=100_000),
unit='ns'
)
df = pd.DataFrame({'val': np.random.randn(100_000)}, index=random_dates)
# Without sort: O(n) scan
import timeit
t1 = timeit.timeit(lambda: df.loc['2022-01':'2022-06'], number=100)
df_sorted = df.sort_index()
t2 = timeit.timeit(lambda: df_sorted.loc['2022-01':'2022-06'], number=100)
print(f'Unsorted: {t1:.3f}s, Sorted: {t2:.3f}s, Speedup: {t1/t2:.1f}x')Vérification rapide
Vérifiez votre compréhension du tri par index dans Pandas.
Récapitulatif de la leçon
Dans cette leçon, vous avez appris que sort_index() réorganise les lignes selon leur étiquette (et non selon les valeurs des colonnes), que axis=1 trie les étiquettes de colonnes par ordre alphabétique et qu’un index trié permet une recherche binaire, ce qui accélère considérablement les sélections fondées sur le temps. Pour les DataFrames dotés d’un MultiIndex, level= limite le tri à un niveau de la hiérarchie. Vérifiez toujours is_monotonic_increasing avant de vous fier à des recherches efficaces par sélection. Ensuite, nous classerons les valeurs d’une colonne.
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 « Trier par index » est-elle gratuite ?
Oui — le texte complet de « Trier par index » 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 « Trier par index » ?
Réordonnez les lignes selon leur libellé d’index avec sort_index() et comprenez dans quels cas un index trié améliore les performances. 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 « Trier par index » ?
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.