Bla*_*ark 7 python sorting pandas
我有以下数据框,我想先按Criticality排序,然后按名称排序:
Name Criticality
baz High
foo Critical
baz Low
foo Medium
bar High
bar Low
bar Medium
...
Run Code Online (Sandbox Code Playgroud)
我一直试图使用这篇文章中提供的答案来做到这一点,但我无法让它工作.
最终结果应该是这样的
Name Criticality
bar High
bar Medium
bar Low
baz High
baz Low
foo Critical
foo Medium
Run Code Online (Sandbox Code Playgroud)
EdC*_*ica 19
一种方法是使用自定义字典创建"排名"列,然后我们用它来排序,然后在排序后删除列:
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]
Run Code Online (Sandbox Code Playgroud)
小智 5
我使用 pd.Categorical 为我工作
In [114]: df = pd.DataFrame({
'Name' : ["baz","foo","baz","foo","bar","bar","bar"],
'Criticality' : ["hi", "crt", "lo", "med", "hi", "lo", "med"]
})
...: df['Criticality'] = pd.Categorical(df['Criticality'], ["crt","hi", "med", "lo"])
...: df.sort_values(['Name','Criticality'])
Out[114]:
Name Criticality
4 bar hi
6 bar med
5 bar lo
0 baz hi
2 baz lo
1 foo crt
3 foo med
Run Code Online (Sandbox Code Playgroud)