comment trier la trame de données pandas d'une colonne

237

J'ai une trame de données comme celle-ci:

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 voir, 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 selon l'ordre des mois civils?

Sachila Ranawaka
la source

Réponses:

327

Utilisez sort_valuespour trier le df selon les 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 par deux colonnes, passez une liste d'étiquettes de colonne à sort_valuesavec les étiquettes de colonne ordonnées selon la priorité de tri. Si vous utilisez df.sort_values(['2', '0']), le résultat sera trié par colonne 2puis colonne 0. Certes, cela n'a pas vraiment de sens pour cet exemple car chaque valeur dans df['2']est unique.

EdChum
la source
75

J'ai essayé les solutions ci-dessus et je n'obtiens pas de résultats, j'ai donc trouvé une solution différente qui fonctionne pour moi. La valeur ascendante = False consiste à ordonner la trame de données dans l' ordre décroissant , par défaut, elle est True . 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 .

Joel Carneiro
la source
9

Ajout de quelques opérations supplémentaires sur les données. Supposons que nous ayons une trame de données df, 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 la sortedsortie des étiquettes en tant quedataframe

    index   label
0   test        2
1   experiment  1
Harry_pb
la source
7

Tout comme une autre solution:

vous pouvez classer vos données de chaîne (nom du mois) et trier par ceci 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)

Il vous donnera les données ordonnées par month namecomme vous l'avez spécifié lors de la création de l' Categoricalobjet.

alireza yazdandoost
la source