Повторная выборка с определенным условием в пандах

У меня есть dataframe df, который выглядит следующим образом:

Start date              Final date                      Value   ID    Serial     
2022-09-01 01:09:07.093 2022-09-01 05:43:55.092999999   10.92   200   120
2022-09-01 01:14:07.093 2022-09-01 05:43:55.092999999   10.92   200   120
2022-09-01 01:19:07.093 2022-09-01 05:43:55.092999999   10.92   200   120
2022-09-01 01:13:07.093 2022-09-01 03:41:55.092999999   11.85   201   122
...
2022-09-02 01:19:07.093 2022-09-03 07:43:55.092999999   7.35    300   124
2022-09-02 01:24:07.093 2022-09-03 07:43:55.092999999   7.35    300   124
...

Для каждого совпадения «ID» и «Серийный номер» данные регистрируются каждые пять минут с «Дата начала» до «Дата окончания».

Я хочу передискретизировать этот фрейм данных каждые 15 минут и взять сумму «Значение». Мой основной подход был:

df = df.resample('15min', on='Start date')['Value'].sum()

Однако это учитывает каждое совпадение «ID» и «Serial» более одного раза за временной интервал. Я хочу передискретизировать фрейм данных, но с учетом только одного совпадения «ID» и «Serial» за 15-минутный промежуток.

Для данного примера вывод должен выглядеть следующим образом (поскольку «ID» и «Serial» повторяются, функция повторной выборки должна учитывать их только один раз за временной интервал):

Date                 Value                  
2022-09-01 01:00:00  22.70
2022-09-01 01:15:00  10.92
...
2022-09-02 01:15:00  7.35
...

Вместо этого я получаю на данный момент:

Date                 Value                  
2022-09-01 01:00:00  33.69
2022-09-01 01:15:00  10.92
...
2022-09-02 01:15:00  14.7
...

Примечание. Для каждого временного промежутка у меня есть много разных комбинаций «ID» и «Serial».

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать groupby.apply:

out = (df.groupby(pd.Grouper(freq='15T', key='Start date'))
         .apply(lambda x: x.drop_duplicates(subset=['ID', 'Serial'])['Value'].sum())
       )

Выход:

Start date
2022-09-01 01:00:00    22.77
2022-09-01 01:15:00    10.92
2022-09-01 01:30:00     0.00
2022-09-01 01:45:00     0.00
2022-09-01 02:00:00     0.00
                       ...  
2022-09-02 00:15:00     0.00
2022-09-02 00:30:00     0.00
2022-09-02 00:45:00     0.00
2022-09-02 01:00:00     0.00
2022-09-02 01:15:00     7.35
Freq: 15T, Length: 98, dtype: float64

но если я удалю дубликаты, я потеряю все значения идентификатора и серийного номера, которые должны учитываться в другие промежутки времени, не так ли? проблема в том, что для каждого временного промежутка он должен учитываться только один раз. Но может быть так, что его нужно рассматривать в нескольких промежутках времени.

OAP 22.11.2022 15:08

Я только что отредактировал вопрос с дополнительной строкой данных, показывающей этот случай.

OAP 22.11.2022 15:11

@OAP, понял, дай мне знать, если обновление работает для тебя

mozway 22.11.2022 15:26

Другие вопросы по теме