Pandas & NumPy Academy · Leçon

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.

Leçon 2 sur 413 étapes

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    100

Trier 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       10

Trier 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      400

Diffé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  2

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

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

Toutes les leçons de ce cours

  1. Trier par valeurs de colonne
  2. Trier par index
  3. Classer les valeurs
  4. Définir et réinitialiser l’index
← Retour à Pandas & NumPy Academy