J'ai un cadre de données comme ceci:
print(df)
0 1 2
0 354.7 April 4.0
1 55.4 August 8.0
2 176.5 December 12.0
3 95.5 February 2.0
4 85.6 January 1.0
5 152 July 7.0
6 238.7 June 6.0
7 104.8 March 3.0
8 283.5 May 5.0
9 278.8 November 11.0
10 249.6 October 10.0
11 212.7 September 9.0
Comme vous pouvez le constater, les mois ne sont pas dans l'ordre du calendrier. J'ai donc créé une deuxième colonne pour obtenir le numéro du mois correspondant à chaque mois (1-12). À partir de là, comment puis-je trier ce bloc de données en fonction de la commande des mois calendaires?
Utilisez sort_values
pour trier le df en fonction des valeurs d'une colonne spécifique:
In [18]:
df.sort_values('2')
Out[18]:
0 1 2
4 85.6 January 1.0
3 95.5 February 2.0
7 104.8 March 3.0
0 354.7 April 4.0
8 283.5 May 5.0
6 238.7 June 6.0
5 152.0 July 7.0
1 55.4 August 8.0
11 212.7 September 9.0
10 249.6 October 10.0
9 278.8 November 11.0
2 176.5 December 12.0
Si vous souhaitez trier sur deux colonnes, transmettez une liste d'étiquettes de colonnes à sort_values
avec les étiquettes de colonnes ordonnées en fonction de la priorité de tri. Si vous utilisez df.sort_values(['2', '0'])
, le résultat sera trié par colonne 2
puis par colonne 0
. Certes, cela n’a pas vraiment de sens pour cet exemple, car chaque valeur de df['2']
est unique.
J'ai essayé les solutions ci-dessus et je n'ai pas obtenu de résultats. J'ai donc trouvé une solution différente qui fonctionne pour moi. Le croissant = False consiste à ordonner le bloc de données dans l'ordre décroissant , par défaut, il est vrai . J'utilise les versions python 3.6.6 et pandas 0.23.4.
final_df = df.sort_values(by=['2'], ascending=False)
Vous pouvez voir plus de détails dans la documentation des pandas ici .
Il suffit d'ajouter quelques opérations supplémentaires sur les données. Supposons que nous ayons une structure de données df
name__, nous pouvons effectuer plusieurs opérations pour obtenir les sorties souhaitées.
ID cost tax label
1 216590 1600 test
2 523213 1800 test
3 250 1500 experiment
df['label'].value_counts().to_frame().reset_index()).sort_values('label', ascending=False)
donnera à sorted
le nom des étiquettes sous la forme dataframe
name__
index label
0 test 2
1 experiment 1
Juste comme une autre solution:
vous pouvez classer vos données de chaîne (nom du mois) et les trier comme ceci:
df.rename(columns={1:'month'},inplace=True)
df['month'] = pd.Categorical(df['month'],categories=['December','November','October','September','August','July','June','May','April','March','February','January'],ordered=True)
df = df.sort_values('month',ascending=False)
Vous obtiendrez les données triées par nom de mois comme vous le dites lors de la création de l’objet Categorical
.