Sort by certain order (Situation: pandas DataFrame Groupby)
<p>I want to change the day of order presented by below code.<br>
What I want is a result with the order (Mon, Tue, Wed, Thu, Fri, Sat, Sun) <br> - should I say, sort by key in certain predefined order?</p>

<hr>

<p>Here is my code which needs some tweak:</p>

<pre><code>f8 = df_toy_indoor2.groupby(['device_id', 'day'])['dwell_time'].sum()

print(f8)
</code></pre>

<p>Current result:</p>

<pre><code>device_id                         day
device_112                        Thu     436518
                                  Wed     636451
                                  Fri     770307
                                  Tue     792066
                                  Mon     826862
                                  Sat     953503
                                  Sun    1019298
device_223                        Mon    2534895
                                  Thu    2857429
                                  Tue    3303173
                                  Fri    3548178
                                  Wed    3822616
                                  Sun    4213633
                                  Sat    4475221
</code></pre>

<p>Desired result:</p>

<pre><code>device_id                         day
device_112                        Mon     826862  
                                  Tue     792066
                                  Wed     636451 
                                  Thu     436518
                                  Fri     770307
                                  Sat     953503
                                  Sun    1019298
device_223                        Mon    2534895
                                  Tue    3303173
                                  Wed    3822616
                                  Thu    2857429
                                  Fri    3548178
                                  Sat    4475221
                                  Sun    4213633
</code></pre>

<hr>

<p>Here, <code>type(df_toy_indoor2.groupby(['device_id', 'day'])['dwell_time'])</code> is a class 'pandas.core.groupby.SeriesGroupBy'.</p>

<p>I have found <code>.sort_values()</code> , but it is a built-in sort function by values. <br>
 I want to get some pointers to set some order to use it further data manipulation.<br>
Thanks in advance.</p>

<p>Set the <code>'day'</code> column as <a href="http://pandas.pydata.org/pandas-docs/stable/categorical.html" rel="nofollow">categorical</a> dtype, just make sure when you set the category your list of days is sorted as you'd like it to be.  Performing the <code>groupby</code> will then automatically sort it for you, but if you otherwise tried to sort the column it will sort in the correct order that you specify.</p>

<pre><code># Initial setup.
np.random.seed([3,1415])
n = 100
days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
df = pd.DataFrame({
    'device_id': np.random.randint(1,3,n),
    'day': np.random.choice(days, n),
    'dwell_time':np.random.random(n)
    })


# Set as category, groupby, and sort.
df['day'] = df['day'].astype("category", categories=days, ordered=True)
df = df.groupby(['device_id', 'day']).sum()
</code></pre>

<p>The resulting output:</p>

<pre><code>               dwell_time
device_id day            
1         Mon    4.428626
          Tue    3.259319
          Wed    2.436024
          Thu    0.909724
          Fri    4.974137
          Sat    5.583778
          Sun    2.687258
2         Mon    3.117923
          Tue    2.427154
          Wed    1.943927
          Thu    4.599547
          Fri    2.628887
          Sat    6.247520
          Sun    2.716886
</code></pre>

<p>Note that this method works for any type of customized sorting.  For example, if you had a column with entries <code>'a', 'b', 'c'</code>, and wanted it to be sorted in a non-standard order, e.g. <code>'c', 'a', 'b'</code>, you'd just do the same type of procedure: specify the column as categorical with your categories being in the non-standard order you want.</p>

python sorting pandas