Custom sorting with Pandas
One approach would be to use a custom dict to create a 'rank' column, we then use to sort with and then drop the column after sorting:
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]
Based on the answer of EdChum, this worked for me :
custom_dict = {'Critical':0, 'High':1, 'Medium':2, 'Low':3}
df['rank'] = df['Criticality'].map(custom_dict)
# now sort by 'Name' and 'rank', it will first sort by 'Name' column first and then 'rank'
df.sort_values(by=['Name', 'rank'],inplace=True)
# now drop the 'rank' column
df.drop(labels=['rank'],axis=1)
Basically, I used "sort_values" instead of "sort" and 'by" instead of "columns"
I works for me using 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