marupav
marupav

Reputation: 335

How to sort in customized order in python pandas?

I have a dataframe in below format

country region  measure Option1 Option2
A   R1  141 max max
A   R1  141 max min
A   R1  141 max default
A   R1  86  min max
A   R1  86  min min
A   R1  86  min default
A   R1  86  default max
A   R1  86  default min
A   R1  86  default default
A   R2  215 max max
A   R2  215 max min
A   R2  215 max default
A   R2  72  min max
A   R2  72  min min
A   R2  72  min default
A   R2  72  default max
A   R2  72  default min
A   R2  72  default default
A   R3  473 max max
A   R3  473 max min
A   R3  473 max default
A   R3  36  min max
A   R3  36  min min
A   R3  36  min default
A   R3  36  default max
A   R3  36  default min
A   R3  36  default default

after sorting using df.sort(['country','Option1','Option2','region'])

country region  measure Option1 Option2
A   R1  86  default default
A   R2  72  default default
A   R3  36  default default
A   R1  86  default max
A   R2  72  default max
A   R3  36  default max
A   R1  86  default min
A   R2  72  default min
A   R3  36  default min
A   R1  141 max default
A   R2  215 max default
A   R3  473 max default
A   R1  141 max max
A   R2  215 max max
A   R3  473 max max
A   R1  141 max min
A   R2  215 max min
A   R3  473 max min
A   R1  86  min default
A   R2  72  min default
A   R3  36  min default
A   R1  86  min max
A   R2  72  min max
A   R3  36  min max
A   R1  86  min min
A   R2  72  min min
A   R3  36  min min

Here I want to specifically have the order in below format:

country region  measure Option1 Option2
A   R1  86  min min
A   R2  72  min min
A   R3  36  min min
A   R1  86  min max
A   R2  72  min max
A   R3  36  min max
A   R1  86  min default
A   R2  72  min default
A   R3  36  min default
A   R1  86  default min
A   R2  72  default min
A   R3  36  default min
A   R1  86  default default
A   R2  72  default default
A   R3  36  default default
A   R1  86  default max
A   R2  72  default max
A   R3  36  default max
A   R1  141 max min
A   R2  215 max min
A   R3  473 max min
A   R1  141 max default
A   R2  215 max default
A   R3  473 max default
A   R1  141 max max
A   R2  215 max max
A   R3  473 max max

Can anyone help me with an approach to achieve this customized order of rows?

Upvotes: 1

Views: 129

Answers (1)

jezrael
jezrael

Reputation: 862601

You can use sorted Categorical, but in column Option2 is it different, stil order is min, max and default:

d3['Option1'] = pd.Categorical(d3['Option1'],['min','default','max'], ordered=True)
d3['Option2'] = pd.Categorical(d3['Option2'],['min','max','default'], ordered=True)
d3 = d3.sort_values(['country','Option1', 'Option2' ])
print d3
   country region  measure  Option1  Option2
4        A     R1       86      min      min
13       A     R2       72      min      min
22       A     R3       36      min      min
3        A     R1       86      min      max
12       A     R2       72      min      max
21       A     R3       36      min      max
5        A     R1       86      min  default
14       A     R2       72      min  default
23       A     R3       36      min  default
7        A     R1       86  default      min
16       A     R2       72  default      min
25       A     R3       36  default      min
6        A     R1       86  default      max
15       A     R2       72  default      max
24       A     R3       36  default      max
8        A     R1       86  default  default
17       A     R2       72  default  default
26       A     R3       36  default  default
1        A     R1      141      max      min
10       A     R2      215      max      min
19       A     R3      473      max      min
0        A     R1      141      max      max
9        A     R2      215      max      max
18       A     R3      473      max      max
2        A     R1      141      max  default
11       A     R2      215      max  default
20       A     R3      473      max  default
31       B     R1       79      min      min
40       B     R2       88      min      min
49       B     R3       54      min      min
30       B     R1      384      min      max
39       B     R2      439      min      max
48       B     R3      172      min      max
32       B     R1       79      min  default
41       B     R2       88      min  default
50       B     R3       54      min  default
34       B     R1       79  default      min
43       B     R2       88  default      min
52       B     R3       54  default      min
33       B     R1      384  default      max
42       B     R2      439  default      max
51       B     R3      172  default      max
35       B     R1       79  default  default
44       B     R2       88  default  default
53       B     R3       54  default  default
28       B     R1       79      max      min
37       B     R2       88      max      min
46       B     R3       54      max      min
27       B     R1      384      max      max
36       B     R2      439      max      max
45       B     R3      172      max      max
29       B     R1       79      max  default
38       B     R2       88      max  default
47       B     R3       54      max  default

Or:

d3['Option1'] = pd.Categorical(d3['Option1'],['min','default','max'], ordered=True)
d3['Option2'] = pd.Categorical(d3['Option2'],['min','default','max'], ordered=True)
d3 = d3.sort_values(['country','Option1', 'Option2' ])
print d3

   country region  measure  Option1  Option2
4        A     R1       86      min      min
13       A     R2       72      min      min
22       A     R3       36      min      min
5        A     R1       86      min  default
14       A     R2       72      min  default
23       A     R3       36      min  default
3        A     R1       86      min      max
12       A     R2       72      min      max
21       A     R3       36      min      max
7        A     R1       86  default      min
16       A     R2       72  default      min
25       A     R3       36  default      min
8        A     R1       86  default  default
17       A     R2       72  default  default
26       A     R3       36  default  default
6        A     R1       86  default      max
15       A     R2       72  default      max
24       A     R3       36  default      max
1        A     R1      141      max      min
10       A     R2      215      max      min
19       A     R3      473      max      min
2        A     R1      141      max  default
11       A     R2      215      max  default
20       A     R3      473      max  default
0        A     R1      141      max      max
9        A     R2      215      max      max
18       A     R3      473      max      max
31       B     R1       79      min      min
40       B     R2       88      min      min
49       B     R3       54      min      min
32       B     R1       79      min  default
41       B     R2       88      min  default
50       B     R3       54      min  default
30       B     R1      384      min      max
39       B     R2      439      min      max
48       B     R3      172      min      max
34       B     R1       79  default      min
43       B     R2       88  default      min
52       B     R3       54  default      min
35       B     R1       79  default  default
44       B     R2       88  default  default
53       B     R3       54  default  default
33       B     R1      384  default      max
42       B     R2      439  default      max
51       B     R3      172  default      max
28       B     R1       79      max      min
37       B     R2       88      max      min
46       B     R3       54      max      min
29       B     R1       79      max  default
38       B     R2       88      max  default
47       B     R3       54      max  default
27       B     R1      384      max      max
36       B     R2      439      max      max
45       B     R3      172      max      max    

Upvotes: 1

Related Questions