2014-04-24 49 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