14

I have pandas DataFrame that includes Day of Week column.

df_weekday = df.groupby(['Day of Week']).sum()
df_weekday[['Spent', 'Clicks', 'Impressions']].plot(figsize=(16,6), subplots=True);

plot the DataFrame displays 'Day of Week' in alphabetical order: 'Friday', 'Monday', 'Saturday', 'Sunday' , 'Tuesday' , 'Thursday', 'Wednesday'.

how can i sort and display df_weekday in proper weekday order 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'. ?

jezrael
  • 822,522
  • 95
  • 1,334
  • 1,252
Nour
  • 163
  • 1
  • 1
  • 4

2 Answers2

36

You can use ordered catagorical first:

cats = [ 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']

df['Day of Week'] = df['Day of Week'].astype('category', categories=cats, ordered=True)

In pandas 0.21.0+ use:

from pandas.api.types import CategoricalDtype
cat_type = CategoricalDtype(categories=cats, ordered=True)
df['Day of Week'] = df['Day of Week'].astype(cat_type)

Or reindex:

df_weekday = df.groupby(['Day of Week']).sum().reindex(cats) 
jezrael
  • 822,522
  • 95
  • 1,334
  • 1,252
0

A simple and robust solution is to include day numbers in a multi-index for sorting automatically.

birthdays = df.groupby([df['date'].dt.day_of_week,df['date'].dt.day_name()])['births'].sum()
birthdays = birthdays.droplevel(0,'index')

The full example on birthdays data

# group and sort by day-of-week

import pandas as pd
host = 'raw.github.com'
user = 'fivethirtyeight'
repo = 'data'
branch = 'master'
file = 'births/US_births_2000-2014_SSA.csv'
url = f'https://{host}/{user}/{repo}/{branch}/{file}'
df = pd.read_csv(url,sep=',',header=0)
df['date'] = df[['year','month','date_of_month']].astype(str).apply('-'.join,axis=1)
df['date'] = pd.to_datetime(df['date'])
df = df[['date','births']]
df.head()

import seaborn as sns
birthdays = df.groupby([df['date'].dt.day_of_week,df['date'].dt.day_name()])['births'].sum()
birthdays = birthdays.droplevel(0,'index')
sns.barplot(data=birthdays.reset_index(),x='date',y='births')

enter image description here

Maciej Skorski
  • 2,303
  • 6
  • 14