Note: this process is much more difficult after pivot. However, we can setup the Categorical for days of the week as suggested by Sorting pandas dataframe by weekdays, and change the index level to a new CategoricalDtype pandas: convert index type in multiindex dataframe
# Setup Categorical Dtype
c_s = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday',
'Sunday']
cat_dtype = pd.CategoricalDtype(categories=c_s, ordered=True)
# Update Index Level Type
df3.index = df3.index.set_levels(
df3.index.levels[-1].astype(cat_dtype), level=-1
)
# Sort values
df4 = df3.sort_values('day_of_week')
df4:
mean amin amax median count_nonzero
ride_length_min ride_length_min ride_length_min ride_length_min ride_id
member_casual rideable_type day_of_week
casual docked_bike Monday 52.296237 0.0 37127.0 24.0 14377
member docked_bike Monday 17.079518 0.0 1500.0 13.0 22586
casual docked_bike Tuesday 45.694147 0.0 12181.0 24.0 18571
member docked_bike Tuesday 17.577247 0.0 1500.0 14.0 27399
casual docked_bike Wednesday 45.113569 0.0 9936.0 23.0 15911
member docked_bike Wednesday 19.159938 0.0 41271.0 14.0 23778
casual docked_bike Thursday 59.290003 0.0 38537.0 24.0 20917
member docked_bike Thursday 18.380591 0.0 1500.0 14.0 28306
casual docked_bike Friday 48.622839 0.0 24703.0 22.0 18801
member docked_bike Friday 17.734145 0.0 1548.0 13.0 24645
casual docked_bike Saturday 50.722601 0.0 36082.0 25.0 33277
member docked_bike Saturday 20.228570 0.0 9922.0 16.0 31404
casual docked_bike Sunday 55.521422 0.0 32521.0 27.0 32864
member docked_bike Sunday 20.082369 0.0 1500.0 16.0 30169
Notice setting the CategoricalDtype before pivot is much easier as there is more support for changing a column dtype than a specific level of a MultiIndex dtype:
import pandas as pd
# Some Small Sample Data
df3 = pd.DataFrame({'member_casual': ['casual', 'member', 'member'],
'rideable_type': 'docked_bike',
'day_of_week': ['Wednesday', 'Tuesday', 'Monday'],
'a': 'mean',
'b': 'ride_length_min',
'c': 120})
# Setup Categorical Dtype
c_s = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday',
'Sunday']
# Change ColumnDtype
df3['day_of_week'] = pd.Categorical(df3['day_of_week'],
categories=c_s,
ordered=True)
# Pivot and Sort
df4 = (
df3.pivot(index=['member_casual', 'rideable_type', 'day_of_week'],
columns=['a', 'b'],
values='c')
.sort_values('day_of_week')
.rename_axis(columns=[None, None])
)
print(df4)
Sample df4:
mean
ride_length_min
member_casual rideable_type day_of_week
member docked_bike Monday 120
Tuesday 120
casual docked_bike Wednesday 120
DataFrame setup and imports:
import pandas as pd
df3 = pd.DataFrame([
['casual', 'docked_bike', 'Friday', 48.62283921068028, 0.0, 24703.0, 22.0,
18801],
['casual', 'docked_bike', 'Monday', 52.296237045280655, 0.0, 37127.0, 24.0,
14377],
['casual', 'docked_bike', 'Saturday', 50.72260119602127, 0.0, 36082.0, 25.0,
33277],
['casual', 'docked_bike', 'Sunday', 55.521421616358325, 0.0, 32521.0, 27.0,
32864],
['casual', 'docked_bike', 'Thursday', 59.29000334656021, 0.0, 38537.0, 24.0,
20917],
['casual', 'docked_bike', 'Tuesday', 45.6941467880028, 0.0, 12181.0, 24.0,
18571],
['casual', 'docked_bike', 'Wednesday', 45.1135692288354, 0.0, 9936.0, 23.0,
15911],
['member', 'docked_bike', 'Friday', 17.73414485696896, 0.0, 1548.0, 13.0,
24645],
['member', 'docked_bike', 'Monday', 17.079518285663685, 0.0, 1500.0, 13.0,
22586],
['member', 'docked_bike', 'Saturday', 20.22856960896701, 0.0, 9922.0, 16.0,
31404],
['member', 'docked_bike', 'Sunday', 20.08236931950015, 0.0, 1500.0, 16.0,
30169],
['member', 'docked_bike', 'Thursday', 18.38059068748675, 0.0, 1500.0, 14.0,
28306],
['member', 'docked_bike', 'Tuesday', 17.577247344793605, 0.0, 1500.0, 14.0,
27399],
['member', 'docked_bike', 'Wednesday', 19.15993775759105, 0.0, 41271.0,
14.0, 23778]
]).set_index([0, 1, 2])
df3.index.names = ['member_casual', 'rideable_type', 'day_of_week']
df3.columns = pd.MultiIndex.from_arrays([
['mean', 'amin', 'amax', 'median', 'count_nonzero'],
['ride_length_min', 'ride_length_min', 'ride_length_min', 'ride_length_min',
'ride_id']
])