Supposons que j'ai une trame de données avec des colonnes a
, b
et c
, je veux trier la colonne par dataframe b
dans l' ordre croissant, et par colonne c
dans l' ordre décroissant, comment dois - je faire cela?
Supposons que j'ai une trame de données avec des colonnes a
, b
et c
, je veux trier la colonne par dataframe b
dans l' ordre croissant, et par colonne c
dans l' ordre décroissant, comment dois - je faire cela?
Réponses:
Depuis la version 0.17.0, la sort
méthode était déconseillée au profit de sort_values
. sort
a été complètement supprimé dans la version 0.20.0. Les arguments (et les résultats) restent les mêmes:
df.sort_values(['a', 'b'], ascending=[True, False])
Vous pouvez utiliser l'argument croissant de sort
:
df.sort(['a', 'b'], ascending=[True, False])
Par exemple:
In [11]: df1 = pd.DataFrame(np.random.randint(1, 5, (10,2)), columns=['a','b'])
In [12]: df1.sort(['a', 'b'], ascending=[True, False])
Out[12]:
a b
2 1 4
7 1 3
1 1 2
3 1 2
4 3 2
6 4 4
0 4 3
9 4 3
5 4 1
8 4 1
Comme l'a commenté @renadeen
Le tri n'est pas en place par défaut! Vous devez donc affecter le résultat de la méthode de tri à une variable ou ajouter inplace = True à l'appel de méthode.
c'est-à-dire, si vous souhaitez réutiliser df1 en tant que DataFrame trié:
df1 = df1.sort(['a', 'b'], ascending=[True, False])
ou
df1.sort(['a', 'b'], ascending=[True, False], inplace=True)
sort
méthode à une variable ou l'ajouter inplace=True
à l'appel de méthode.
À partir de pandas 0.17.0, il DataFrame.sort()
est obsolète et devrait être supprimé dans une future version de pandas. La façon de trier une trame de données par ses valeurs est maintenantDataFrame.sort_values
En tant que tel, la réponse à votre question serait maintenant
df.sort_values(['b', 'c'], ascending=[True, False], inplace=True)
Pour les grandes trames de données numériques, vous pouvez constater une amélioration significative des performances via numpy.lexsort
, qui effectue un tri indirect à l'aide d'une séquence de clés:
import pandas as pd
import numpy as np
np.random.seed(0)
df1 = pd.DataFrame(np.random.randint(1, 5, (10,2)), columns=['a','b'])
df1 = pd.concat([df1]*100000)
def pdsort(df1):
return df1.sort_values(['a', 'b'], ascending=[True, False])
def lex(df1):
arr = df1.values
return pd.DataFrame(arr[np.lexsort((-arr[:, 1], arr[:, 0]))])
assert (pdsort(df1).values == lex(df1).values).all()
%timeit pdsort(df1) # 193 ms per loop
%timeit lex(df1) # 143 ms per loop
Une particularité est que l'ordre de tri défini avec numpy.lexsort
est inversé: (-'b', 'a')
trie par série en a
premier. Nous nions les séries b
pour indiquer que nous voulons que ces séries soient décroissantes.
Sachez que np.lexsort
ne trie qu'avec des valeurs numériques, tout en pd.DataFrame.sort_values
fonctionnant avec des chaînes ou des valeurs numériques. L' utilisation np.lexsort
avec des cordes donnera: TypeError: bad operand type for unary -: 'str'
.