Сортировать данные по месяцам после групповой операции - PullRequest
2 голосов
/ 27 апреля 2020

Вот пример моих данных:

   Date        Count
11.01.2019       1  
01.02.2019       7  
25.01.2019       4  
23.01.2019       4  
16.03.2019       1  
04.02.2019       5
06.04.2019       1  
04.04.2019       5

Требуемый вывод:

Month  Total_Count
Jan        9
Feb       12
Mar        1
Apr        6

Я использовал следующий код для вышеуказанной операции суммирования, и она работает хорошо, но месяцы перемешаны и не отсортированы соответственно, как январь, февраль

(df.groupby(pd.to_datetime(df['Date'], format='%d.%m.%Y')
   .dt.month_name()
   .str[:3])['Count']
   .sum()
   .rename_axis('Month')
   .reset_index(name='Total_Count'))

Ответы [ 2 ]

3 голосов
/ 27 апреля 2020

Идея состоит в том, чтобы преобразовать столбец в 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
0 голосов
/ 27 апреля 2020

Попробуйте это:

new_df = (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(new_df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...