Tri des pandas 101
sort
a été remplacé dans la v0.20 par DataFrame.sort_values
y DataFrame.sort_index
. En plus de cela, nous avons aussi argsort
.
Voici quelques cas d'utilisation courants en matière de tri, et comment les résoudre à l'aide des fonctions de tri de l'API actuelle. Tout d'abord, la configuration.
# Setup
np.random.seed(0)
df = pd.DataFrame({'A': list('accab'), 'B': np.random.choice(10, 5)})
df
A B
0 a 7
1 c 9
2 c 3
3 a 5
4 b 2
Trier par une seule colonne
Par exemple, pour trier df
par la colonne "A", utiliser sort_values
avec un seul nom de colonne :
df.sort_values(by='A')
A B
0 a 7
3 a 5
4 b 2
1 c 9
2 c 3
Si vous avez besoin d'un nouveau RangeIndex, utilisez DataFrame.reset_index
.
Trier par plusieurs colonnes
Par exemple, pour trier par les deux col "A" et "B" dans df
vous pouvez passer une liste à sort_values
:
df.sort_values(by=['A', 'B'])
A B
3 a 5
0 a 7
4 b 2
2 c 3
1 c 9
Trier par l'index du cadre de données
df2 = df.sample(frac=1)
df2
A B
1 c 9
0 a 7
2 c 3
3 a 5
4 b 2
Vous pouvez le faire en utilisant sort_index
:
df2.sort_index()
A B
0 a 7
1 c 9
2 c 3
3 a 5
4 b 2
df.equals(df2)
# False
df.equals(df2.sort_index())
# True
Voici quelques méthodes comparables avec leurs performances :
%timeit df2.sort_index()
%timeit df2.iloc[df2.index.argsort()]
%timeit df2.reindex(np.sort(df2.index))
605 µs ± 13.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
610 µs ± 24.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
581 µs ± 7.63 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Trier par liste d'indices
Par exemple,
idx = df2.index.argsort()
idx
# array([0, 7, 2, 3, 9, 4, 5, 6, 8, 1])
Ce problème de "tri" est en fait un simple problème d'indexation. Il suffit de passer des étiquettes entières à iloc
fera l'affaire.
df.iloc[idx]
A B
1 c 9
0 a 7
2 c 3
3 a 5
4 b 2