2014-04-24 48 views
7

排序我有以下的數據幀,我想首先由臨界然後排序名稱:定製與熊貓

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

我一直在嘗試這種使用this post提供的答案,但我只是做不能讓它工作。

最終的結果應該是這樣的

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

根據您發佈的最終結果,我認爲您實際上首先需要按名稱排序,然後是Criticality。對? – exp1orer

+0

@ exp1orer是的,但沒有使用外部命令,你最終在關鍵性的alpha排序上不是所需的輸出 – EdChum

+0

EdChum,完全正確。我剛纔問了一下,因爲他的問題說他想要「先按重要性再按名稱排序」。但樣本輸出表明否則。 – exp1orer

回答

18

一個方法是使用自定義字典來創建一個「等級」欄,然後我們用它來進行排序與​​再分類後除去列:

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

非常感謝,這工作就像一個魅力! – Blark