выполните несколько группировок для каждой категории в другом столбце python

#python #pandas #group-by #pandas-groupby #categories

Вопрос:

Как показано в таблице 1 (фрейм данных, df), я хочу сгруппировать переменную ресурса R на основе времени начала(ST) и времени окончания (ET). Для выполнения этой задачи я использовал следующий код 1.

Таблица 1 (df)

 RID ST ET R CAT 1 0 days 04:52:00 0 days 05:06:00 1 1 2 0 days 04:54:00 0 days 08:59:00 1 1 3 0 days 04:56:00 0 days 10:16:00 1 1 4 0 days 04:57:00 0 days 09:15:00 1 2 5 0 days 04:57:00 1 days 01:33:00 1 2 6 0 days 05:02:00 0 days 08:53:00 1 2 7 0 days 05:04:00 0 days 19:08:00 1 3 8 0 days 05:04:00 0 days 20:23:00 1 3 9 0 days 05:06:00 0 days 09:24:00 1 3 10 0 days 05:07:00 0 days 08:20:00 1 3  df=pd.DataFrame({'RID': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10},  'ST': {0: '0 days 04:52:00',  1: '0 days 04:54:00',  2: '0 days 04:56:00',  3: '0 days 04:57:00',  4: '0 days 04:57:00',  5: '0 days 05:02:00',  6: '0 days 05:04:00',  7: '0 days 05:04:00',  8: '0 days 05:06:00',  9: '0 days 05:07:00'},  'ET': {0: '0 days 05:06:00',  1: '0 days 08:59:00',  2: '0 days 10:16:00',  3: '0 days 09:15:00',  4: '1 days 01:33:00',  5: '0 days 08:53:00',  6: '0 days 19:08:00',  7: '0 days 20:23:00',  8: '0 days 09:24:00',  9: '0 days 08:20:00'},  'R': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1},  'CAT': {0: 1, 1: 1, 2: 1, 3: 2, 4: 2, 5: 2, 6: 3, 7: 3, 8: 3, 9: 3}})  

Код 1

 df1.index=pd.to_timedelta(df['ET']) df2.index=pd.to_timedelta(df['ST']) df_final=df1.groupby(pd.Grouper(freq='1Min')).sum()['R'].fillna(0).subtract(df2.groupby(pd.Grouper(freq='1Min')).sum()['R'].fillna(0),fill_value=0).cumsum() x = pd.DataFrame(df_final.reset_index())  

Результаты, которые я получил, — это первые две колонки в таблице 2. Однако операция выполняется независимо от значения категории в переменной «CAT». Как я могу выполнить описанную выше операцию для каждого значения в CAT.

Таблица 2

 index R  0 days 04:52:00 -1  0 days 04:53:00 -1  0 days 04:54:00 -2 0 days 04:55:00 -2 0 days 04:56:00 -3 0 days 04:57:00 -5 0 days 04:58:00 -5 0 days 04:59:00 -5 0 days 05:00:00 -5 0 days 05:01:00 -5 0 days 05:02:00 -6 0 days 05:03:00 -6 0 days 05:04:00 -8 0 days 05:05:00 -8 0 days 05:06:00 -8 0 days 05:07:00 -10  

Комментарии:

1. Совет, как быстрее получить помощь: предоставьте код для создания образца фрейма данных, например pd.DataFrame(...) . Таким образом, больше людей смогут мгновенно копировать/вставлять и проводить больше времени, играя с самими данными, вместо того, чтобы собирать фрейм данных из предоставленного вами текстового вывода.

2. @user17242583 Спасибо. Я внес предложенное изменение.

Ответ №1:

Вы можете попробовать следующий код:

 df1.index=pd.to_timedelta(df['ET']) df2.index=pd.to_timedelta(df['ST']) df_final=df1.groupby(['CAT',pd.Grouper(freq='1Min')]).sum()['R'].fillna(0).subtract(df2.groupby(['CAT',pd.Grouper(freq='1Min')]).sum()['R'].fillna(0),fill_value=0).cumsum() x = pd.DataFrame(df_final.reset_index())  

Добавьте CAT столбец в groupby, это должно решить вашу проблему.