web-dev-qa-db-fra.com

comment trier les données de pandas d'une colonne

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?

133
Sachila Ranawaka

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.

184
EdChum

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 .

33
Joel Carneiro

Il suffit d'ajouter quelques opérations supplémentaires sur les données. Supposons que nous ayons une structure de données dfname__, 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 à sortedle nom des étiquettes sous la forme dataframename__

    index   label
0   test        2
1   experiment  1
6
Harry_pb

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.

0