#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, это должно решить вашу проблему.