Идея состоит в том, чтобы преобразовать столбец в datetime, затем сортировать и группировать по sort=False
, чтобы избежать сортировки по умолчанию в groupby
:
df['Date'] = pd.to_datetime(df['Date'], format='%d.%m.%Y')
df1 = (df.sort_values('Date')
.groupby(df['Date'].dt.month_name().str[:3], sort=False)['Count']
.sum()
.rename_axis('Month')
.reset_index(name='Total_Count'))
print (df1)
Month Total_Count
0 Jan 9
1 Feb 12
2 Mar 1
3 Apr 6
Еще одна идея, спасибо, anky, это упорядоченное использование Categorical
s, затем необходимо удалить sort=False
:
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
df1 = (df.groupby(pd.Categorical(pd.to_datetime(df['Date'], format='%d.%m.%Y')
.dt.month_name().str[:3],ordered=True,categories=months))['Count']
.sum()
.rename_axis('Month')
.reset_index(name='Total_Count'))
или используя Series.reindex
:
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
df1 = (df.groupby(pd.to_datetime(df['Date'], format='%d.%m.%Y')
.dt.month_name().str[:3])['Count']
.sum()
.rename_axis('Month')
.reindex(months, fill_value=0)
.reset_index(name='Total_Count'))
print (df1)
Month Total_Count
0 Jan 9
1 Feb 12
2 Mar 1
3 Apr 6
4 May 0
5 Jun 0
6 Jul 0
7 Aug 0
8 Sep 0
9 Oct 0
10 Nov 0
11 Dec 0