2014-04-24 12 views
7

Mam następujący dataframe że chciałbym posortować najpierw Krytyczność a następnie według nazwy:Niestandardowe sortowanie z Pand

Name  Criticality 
baz   High 
foo   Critical 
baz   Low 
foo   Medium 
bar   High 
bar   Low 
bar   Medium 
... 

Próbowałem to zrobić za pomocą dostarczonego w this post odpowiedź, ale ja po prostu nie mogę go uruchomić.

Wynik końcowy powinien być tak

Name  Criticality 
bar   High 
bar   Medium 
bar   Low 
baz   High 
baz   Low 
foo   Critical 
foo   Medium 
+0

Na podstawie opublikowanego wyniku końcowego, myślę, że chcesz najpierw posortować według nazwy, a następnie Krytyczność. Dobrze? – exp1orer

+0

@ exp1lub tak, ale bez użycia zewnętrznego zamówienia kończysz z sortowaniem alfa na Krytyczności, która nie jest pożądanym wyjściem – EdChum

+0

EdChum, całkowicie w porządku. Po prostu zapytałem, ponieważ jego pytanie mówi, że chce "najpierw uporządkować według Krytyczności, a potem według nazwy". ale wynik próby sugeruje inaczej. – exp1orer

Odpowiedz

18

Jedno podejście byłoby użyć niestandardowego dict stworzyć „rangi” kolumny, możemy użyć do sortowania z a następnie upuścić kolumnę po sortowaniu:

In [17]: 
custom_dict = {'Critical':0, 'High':1, 'Medium':2, 'Low':3} 
df['rank'] = df['Criticality'].map(custom_dict) 
df 

Out[17]: 

    Name Criticality rank 
0 baz  High  1 
1 foo Critical  0 
2 baz   Low  3 
3 foo  Medium  2 
4 bar  High  1 
5 bar   Low  3 
6 bar  Medium  2 

[7 rows x 3 columns] 

In [19]: 
# now sort by 'Name' and 'rank', it will first sort by 'Name' column first and then 'rank' 
df.sort(columns=['Name', 'rank'],inplace=True) 
df 

Out[19]: 

    Name Criticality rank 
4 bar  High  1 
6 bar  Medium  2 
5 bar   Low  3 
0 baz  High  1 
2 baz   Low  3 
1 foo Critical  0 
3 foo  Medium  2 

[7 rows x 3 columns] 

In [21]: 
# now drop the 'rank' column 
df.drop(labels=['rank'],axis=1) 

Out[21]: 

    Name Criticality 
4 bar  High 
6 bar  Medium 
5 bar   Low 
0 baz  High 
2 baz   Low 
1 foo Critical 
3 foo  Medium 

[7 rows x 2 columns] 
+0

Dziękuję bardzo, działa to jak urok! – Blark