Skip to content

pandas : Trier des DataFrame, des séries avec sort_values(), sort_index()

Pour trier pandas.DataFrame et pandas.Series, utilisez sort_values() et sort_index(). Vous pouvez trier par ordre croissant ou décroissant, ou trier sur plusieurs colonnes.

Notez que la méthode sort() de l’ancienne version est obsolète.

Cet article décrit le contenu suivant.

  • Trier par élément (données) :sort_values()
    • Croissant ou décroissant :ascending
    • Trier par plusieurs colonnes
    • Manipuler NaN :na_position
    • Modifier l’objet d’origine :inplace
    • Trier dans le sens des lignes :axis
  • Trier par index/colonnes (noms de lignes/colonnes) :sort_index()
    • Trier par index (nom de ligne)
    • Croissant ou décroissant :ascending
    • Modifier l’objet d’origine :inplace
    • Trier par colonnes (nom de colonne) :axis

Les données suivantes sont utilisées à titre d’exemple.

import pandas as pd

df = pd.read_csv('data/src/sample_pandas_normal.csv')
print(df)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

L’exemple utilise pandas.DataFrame, mais pandas.Series fournit également reset_index(). L’utilisation est la même.

Trier par élément (données) :sort_values()

Pour trier par valeur d’élément, utilisez la méthode sort_values().

Spécifiez l’étiquette de la colonne (nom de la colonne) par laquelle vous souhaitez trier le premier argument.

df_s = df.sort_values('state')
print(df_s)
#       name  age state  point
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 4    Ellen   24    CA     88
# 0    Alice   24    NY     64
# 5    Frank   30    NY     57
# 3     Dave   68    TX     70

Utilisez reset_index() pour réaffecter l’index.

Croissant ou décroissant :ascending

La valeur par défaut est de trier par ordre croissant. Si vous avez besoin d’un ordre décroissant, définissez l’argument croissant sur False.

df_s = df.sort_values('state', ascending=False)
print(df_s)
#       name  age state  point
# 3     Dave   68    TX     70
# 0    Alice   24    NY     64
# 5    Frank   30    NY     57
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 4    Ellen   24    CA     88

Trier par plusieurs colonnes

Si vous spécifiez le premier argument par sous forme de liste, vous pouvez effectuer un tri sur plusieurs colonnes.

Triez à partir de la fin de la liste dans l’ordre. Enfin, il trie sur la première colonne spécifiée de la liste.

df_s = df.sort_values(['state', 'age'])
print(df_s)
#       name  age state  point
# 2  Charlie   18    CA     70
# 4    Ellen   24    CA     88
# 1      Bob   42    CA     92
# 0    Alice   24    NY     64
# 5    Frank   30    NY     57
# 3     Dave   68    TX     70

df_s = df.sort_values(['age', 'state'])
print(df_s)
#       name  age state  point
# 2  Charlie   18    CA     70
# 4    Ellen   24    CA     88
# 0    Alice   24    NY     64
# 5    Frank   30    NY     57
# 1      Bob   42    CA     92
# 3     Dave   68    TX     70

Si l’argument croissant est spécifié dans une liste, l’ordre croissant/décroissant peut être sélectionné pour chaque colonne.

df_s = df.sort_values(['age', 'state'], ascending=[True, False])
print(df_s)
#       name  age state  point
# 2  Charlie   18    CA     70
# 0    Alice   24    NY     64
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57
# 1      Bob   42    CA     92
# 3     Dave   68    TX     70

Manipuler NaN :na_position

S’il manque une valeur NaN, par défaut, elle est listée à la fin.

df_nan = df.copy()
df_nan.iloc[:2, 1] = pd.np.nan
print(df_nan)
#       name   age state  point
# 0    Alice   NaN    NY     64
# 1      Bob   NaN    CA     92
# 2  Charlie  18.0    CA     70
# 3     Dave  68.0    TX     70
# 4    Ellen  24.0    CA     88
# 5    Frank  30.0    NY     57

df_nan_s = df_nan.sort_values('age')
print(df_nan_s)
#       name   age state  point
# 2  Charlie  18.0    CA     70
# 4    Ellen  24.0    CA     88
# 5    Frank  30.0    NY     57
# 3     Dave  68.0    TX     70
# 0    Alice   NaN    NY     64
# 1      Bob   NaN    CA     92

Si l’argument na_position=’first’, il est listé en haut.

df_nan_s = df_nan.sort_values('age', na_position='first')
print(df_nan_s)
#       name   age state  point
# 0    Alice   NaN    NY     64
# 1      Bob   NaN    CA     92
# 2  Charlie  18.0    CA     70
# 4    Ellen  24.0    CA     88
# 5    Frank  30.0    NY     57
# 3     Dave  68.0    TX     70

Consultez les articles suivants pour savoir comment supprimer et remplacer les valeurs manquantes.

Modifier l’objet d’origine :inplace

Par défaut, les nouveaux objets triés sont renvoyés, mais si l’argument inplace est défini sur True, l’objet d’origine lui-même est modifié.

df.sort_values('state', inplace=True)
print(df)
#       name  age state  point
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 4    Ellen   24    CA     88
# 0    Alice   24    NY     64
# 5    Frank   30    NY     57
# 3     Dave   68    TX     70

Trier dans le sens des lignes :axis

Comme dans les exemples précédents, par défaut, le tri est effectué dans le sens des colonnes (sens vertical).

Si vous souhaitez trier dans le sens des lignes, définissez l’axe des arguments sur 1. D’autres arguments peuvent être utilisés de la même manière que dans les exemples précédents.

Puisqu’une erreur se produit lorsqu’un nombre et une chaîne sont mélangés, dans cet exemple, les colonnes de chaîne sont supprimées afin que seules les colonnes numériques soient utilisées. Voir l’article suivant pour la méthode drop().

df_d = df.drop(['name', 'state'], axis=1)
print(df_d)
#    age  point
# 1   42     92
# 2   18     70
# 4   24     88
# 0   24     64
# 5   30     57
# 3   68     70

df_d .sort_values(by=1, axis=1, ascending=False, inplace=True)
print(df_d)
#    point  age
# 1     92   42
# 2     70   18
# 4     88   24
# 0     64   24
# 5     57   30
# 3     70   68

Trier par index/colonnes (noms de lignes/colonnes) :sort_index()

Pour trier par index/colonnes (noms de lignes/colonnes), utilisez la méthode sort_index().

Trier par index (nom de ligne)

Par défaut, sort_index() trie dans le sens des colonnes (sens vertical) en fonction du nom de la ligne (étiquette).

print(df)
#       name  age state  point
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 4    Ellen   24    CA     88
# 0    Alice   24    NY     64
# 5    Frank   30    NY     57
# 3     Dave   68    TX     70

df_s = df.sort_index()
print(df_s)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

Croissant ou décroissant :ascending

Comme avec sort_values(), la valeur par défaut est de trier par ordre croissant. Si vous avez besoin d’un ordre décroissant, définissez l’argument croissant sur False.

df_s = df.sort_index(ascending=False)
print(df_s)
#       name  age state  point
# 5    Frank   30    NY     57
# 4    Ellen   24    CA     88
# 3     Dave   68    TX     70
# 2  Charlie   18    CA     70
# 1      Bob   42    CA     92
# 0    Alice   24    NY     64

Modifier l’objet d’origine :inplace

Comme avec sort_values(), vous pouvez utiliser l’argument inplace. Le définir sur True modifie l’objet d’origine.

df.sort_index(inplace=True)
print(df)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

Trier par colonnes (nom de colonne) :axis

En définissant axe = 1, il est trié dans le sens des lignes (sens horizontal) en fonction des colonnes (nom de la colonne). D’autres arguments peuvent être utilisés comme dans les exemples précédents.

df_s = df.sort_index(axis=1)
print(df_s)
#    age     name  point state
# 0   24    Alice     64    NY
# 1   42      Bob     92    CA
# 2   18  Charlie     70    CA
# 3   68     Dave     70    TX
# 4   24    Ellen     88    CA
# 5   30    Frank     57    NY

df.sort_index(axis=1, ascending=False, inplace=True)
print(df)
#   state  point     name  age
# 0    NY     64    Alice   24
# 1    CA     92      Bob   42
# 2    CA     70  Charlie   18
# 3    TX     70     Dave   68
# 4    CA     88    Ellen   24
# 5    NY     57    Frank   30