Pandas Sort Values : Guide complet pour trier les DataFrames en Python
Updated on
Les données non triées sont difficiles à analyser. Vous parcourez des milliers de lignes en essayant de trouver les ventes les plus élevées, les dates les plus récentes ou les taux d'erreur les plus bas -- et vous manquez des patterns qui seraient évidents si les données étaient ordonnées. Le tri d'une liste Python fonctionne pour les cas simples, mais les DataFrames ont plusieurs colonnes, des types mixtes et des valeurs manquantes que les listes ne peuvent pas gérer.
Pandas sort_values() trie n'importe quel DataFrame par une ou plusieurs colonnes, avec un contrôle total sur l'ordre croissant/décroissant, le placement des null et la stabilité. Ce guide couvre tous les patterns de tri que vous rencontrerez dans le travail réel avec les données.
Tri de base avec sort_values()
Trier par une seule colonne
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve'],
'score': [85, 92, 78, 95, 88],
'age': [25, 30, 22, 28, 35]
})
# Trier par score (croissant par défaut)
sorted_df = df.sort_values('score')
print(sorted_df)
# name score age
# 2 Charlie 78 22
# 0 Alice 85 25
# 4 Eve 88 35
# 1 Bob 92 30
# 3 Diana 95 28Tri décroissant
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve'],
'score': [85, 92, 78, 95, 88],
'age': [25, 30, 22, 28, 35]
})
# Scores les plus élevés en premier
sorted_df = df.sort_values('score', ascending=False)
print(sorted_df)
# name score age
# 3 Diana 95 28
# 1 Bob 92 30
# 4 Eve 88 35
# 0 Alice 85 25
# 2 Charlie 78 22Tri en place
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie'],
'score': [85, 92, 78]
})
# Modifier df directement (aucune copie créée)
df.sort_values('score', inplace=True)
print(df)
# name score
# 2 Charlie 78
# 0 Alice 85
# 1 Bob 92Tri multi-colonnes
Trier par plusieurs colonnes
import pandas as pd
df = pd.DataFrame({
'department': ['Sales', 'Engineering', 'Sales', 'Engineering', 'Sales'],
'name': ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve'],
'salary': [70000, 85000, 65000, 90000, 70000]
})
# Trier d'abord par département, puis par salaire dans chaque département
sorted_df = df.sort_values(['department', 'salary'])
print(sorted_df)
# department name salary
# 1 Engineering Bob 85000
# 3 Engineering Diana 90000
# 2 Sales Charlie 65000
# 0 Sales Alice 70000
# 4 Sales Eve 70000Mélange croissant/décroissant
import pandas as pd
df = pd.DataFrame({
'department': ['Sales', 'Engineering', 'Sales', 'Engineering', 'Sales'],
'name': ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve'],
'salary': [70000, 85000, 65000, 90000, 70000]
})
# Département croissant, salaire décroissant
sorted_df = df.sort_values(
['department', 'salary'],
ascending=[True, False]
)
print(sorted_df)
# department name salary
# 3 Engineering Diana 90000
# 1 Engineering Bob 85000
# 0 Sales Alice 70000
# 4 Sales Eve 70000
# 2 Sales Charlie 65000Gestion des valeurs manquantes (NaN)
Par défaut, les valeurs NaN sont placées à la fin quel que soit l'ordre de tri. Utilisez na_position pour contrôler cela :
import pandas as pd
import numpy as np
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'Diana'],
'score': [85, np.nan, 78, np.nan]
})
# NaN à la fin (par défaut)
print(df.sort_values('score'))
# name score
# 2 Charlie 78.0
# 0 Alice 85.0
# 1 Bob NaN
# 3 Diana NaN
# NaN au début
print(df.sort_values('score', na_position='first'))
# name score
# 1 Bob NaN
# 3 Diana NaN
# 2 Charlie 78.0
# 0 Alice 85.0Trier par index avec sort_index()
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie'],
'score': [85, 92, 78]
}, index=[2, 0, 1])
# Trier par index
print(df.sort_index())
# name score
# 0 Bob 92
# 1 Charlie 78
# 2 Alice 85
# Trier par noms de colonnes (axis=1)
df2 = pd.DataFrame({
'c': [1, 2], 'a': [3, 4], 'b': [5, 6]
})
print(df2.sort_index(axis=1))
# a b c
# 0 3 5 1
# 1 4 6 2Réinitialiser l'index après le tri
Après le tri, l'index original est conservé. Pour obtenir un index séquentiel propre :
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie'],
'score': [85, 92, 78]
})
sorted_df = df.sort_values('score').reset_index(drop=True)
print(sorted_df)
# name score
# 0 Charlie 78
# 1 Alice 85
# 2 Bob 92Utilisez drop=True pour supprimer l'ancien index. Sans ce paramètre, l'ancien index devient une colonne.
Ordre de tri personnalisé
Utilisation des types catégoriels
import pandas as pd
df = pd.DataFrame({
'priority': ['Medium', 'High', 'Low', 'High', 'Medium'],
'task': ['Task A', 'Task B', 'Task C', 'Task D', 'Task E']
})
# Définir un ordre personnalisé
priority_order = pd.CategoricalDtype(['Low', 'Medium', 'High'], ordered=True)
df['priority'] = df['priority'].astype(priority_order)
sorted_df = df.sort_values('priority')
print(sorted_df)
# priority task
# 2 Low Task C
# 0 Medium Task A
# 4 Medium Task E
# 1 High Task B
# 3 High Task DUtilisation du paramètre key
import pandas as pd
df = pd.DataFrame({
'name': ['alice', 'Bob', 'CHARLIE', 'diana'],
'score': [85, 92, 78, 95]
})
# Tri insensible à la casse
sorted_df = df.sort_values('name', key=lambda x: x.str.lower())
print(sorted_df)
# name score
# 0 alice 85
# 1 Bob 92
# 2 CHARLIE 78
# 3 diana 95Comparaison des méthodes
| Méthode | Objectif | Modifie l'original ? | Retourne |
|---|---|---|---|
sort_values(col) | Trier par valeurs de colonne | Non (sauf inplace=True) | DataFrame trié |
sort_values([col1, col2]) | Trier par plusieurs colonnes | Non (sauf inplace=True) | DataFrame trié |
sort_index() | Trier par index de ligne | Non (sauf inplace=True) | DataFrame trié |
nsmallest(n, col) | Obtenir les n plus petites valeurs | Non | Sous-ensemble de DataFrame |
nlargest(n, col) | Obtenir les n plus grandes valeurs | Non | Sous-ensemble de DataFrame |
rank() | Attribuer des rangs aux valeurs | Non | Series de rangs |
Conseils de performance
nlargest() et nsmallest() pour le Top-N
Quand vous n'avez besoin que des N premières ou dernières lignes, nlargest() et nsmallest() sont plus rapides que le tri de l'ensemble du DataFrame :
import pandas as pd
import numpy as np
# Grand DataFrame
df = pd.DataFrame({
'id': range(1_000_000),
'value': np.random.randn(1_000_000)
})
# Plus rapide : trouver seulement le top 10
top_10 = df.nlargest(10, 'value')
# Plus lent : trie tout, puis découpe
top_10_slow = df.sort_values('value', ascending=False).head(10)Tri stable vs instable
import pandas as pd
df = pd.DataFrame({
'group': ['A', 'B', 'A', 'B'],
'value': [1, 1, 2, 2],
'order': [1, 2, 3, 4]
})
# Tri stable (par défaut) conserve l'ordre original pour les égalités
stable = df.sort_values('value', kind='mergesort') # Par défaut
# Tri instable (plus rapide pour les grands jeux de données)
unstable = df.sort_values('value', kind='quicksort')Exemples pratiques
Trier des dates
import pandas as pd
df = pd.DataFrame({
'event': ['Launch', 'Meeting', 'Deadline', 'Review'],
'date': pd.to_datetime(['2026-03-15', '2026-01-10', '2026-02-28', '2026-01-05'])
})
# Ordre chronologique
print(df.sort_values('date'))
# event date
# 3 Review 2026-01-05
# 1 Meeting 2026-01-10
# 2 Deadline 2026-02-28
# 0 Launch 2026-03-15Tri avec GroupBy
import pandas as pd
df = pd.DataFrame({
'store': ['A', 'A', 'B', 'B', 'A', 'B'],
'product': ['X', 'Y', 'X', 'Y', 'Z', 'Z'],
'revenue': [100, 250, 150, 300, 200, 175]
})
# Produit le plus rentable par magasin
top_per_store = (df.sort_values('revenue', ascending=False)
.groupby('store')
.head(1))
print(top_per_store)
# store product revenue
# 3 B Y 300
# 1 A Y 250Explorer visuellement les données triées
Après avoir trié votre DataFrame pour trouver des patterns, PyGWalker (opens in a new tab) vous permet d'explorer les mêmes données via des graphiques interactifs par glisser-déposer dans Jupyter -- sans code supplémentaire :
import pygwalker as pyg
walker = pyg.walk(sorted_df)FAQ
Comment trier un DataFrame par colonne dans pandas ?
Utilisez df.sort_values('column_name') pour l'ordre croissant ou df.sort_values('column_name', ascending=False) pour décroissant. Pour plusieurs colonnes, passez une liste : df.sort_values(['col1', 'col2']).
Comment trier par plusieurs colonnes avec des ordres différents ?
Passez une liste de booléens à ascending : df.sort_values(['col1', 'col2'], ascending=[True, False]). Cela trie col1 en croissant et col2 en décroissant.
Où vont les valeurs NaN lors du tri ?
Par défaut, les valeurs NaN sont placées à la fin quelle que soit la direction du tri. Utilisez na_position='first' pour les placer au début : df.sort_values('col', na_position='first').
Quelle est la différence entre sort_values et sort_index ?
sort_values() trie par valeurs de colonne. sort_index() trie par l'index de ligne (ou l'index de colonne avec axis=1). Utilisez sort_values pour le tri des données et sort_index quand les lignes doivent être ordonnées par leurs étiquettes d'index.
Comment trier un DataFrame en place sans créer de copie ?
Passez inplace=True : df.sort_values('col', inplace=True). Cela modifie le DataFrame original et retourne None. Cependant, le style pandas moderne préfère la réaffectation : df = df.sort_values('col').
Conclusion
sort_values() est l'outil principal pour trier les DataFrames dans pandas. Utilisez un nom de colonne unique pour les tris simples, une liste pour les tris multi-colonnes et le paramètre ascending pour contrôler la direction. Gérez les valeurs manquantes avec na_position, utilisez nlargest()/nsmallest() pour les requêtes Top-N et CategoricalDtype pour les ordres personnalisés. N'oubliez pas que le tri retourne un nouveau DataFrame par défaut -- utilisez reset_index(drop=True) si vous voulez un index séquentiel propre ensuite.