Объединить / объединить строки интервала времени в отсортированном pandas кадре данных - PullRequest
1 голос
/ 02 февраля 2020

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

SessionNumber     Timestamp_start       Timestamp_complete   Activity   ColB  ColC
2                 2018-02-11 14:17:00   2018-02-11 14:21:00  "A"           3     4
2                 2018-02-11 14:21:00   2018-02-11 14:22:30  "A"           3     4
2                 2018-02-11 14:23:00   2018-02-11 14:28:30  "A"           3     4
2                 2018-02-11 14:29:00   2018-02-11 14:31:30  "B"           3     4
2                 2018-02-11 14:33:00   2018-02-11 14:35:30  "A"           3     4
...        
3                 2018-02-12 08:44:00   2018-02-12 08:50:30  "A"           2     1
3                 2018-02-12 08:51:00   2018-02-12 08:51:30  "A"           2     1

Я хочу объединить те же действия, которые следовали друг за другом, в одну новую строку в зависимости от SessionNumber. Результат из этого примера должен быть следующим:

SessionNumber     Timestamp_start       Timestamp_complete   Activity   ColB  ColC
2                 2018-02-11 14:17:00   2018-02-11 14:28:30  "A"           3     4
2                 2018-02-11 14:29:00   2018-02-11 14:31:30  "B"           3     4
2                 2018-02-11 14:33:00   2018-02-11 14:35:30  "A"           3     4
...        
3                 2018-02-12 08:44:00   2018-02-12 08:51:00  "A"           2     1

Кадр данных отсортирован в следующем порядке: SessionNumber, Timestamp_start, Activity

Внутри того же SessionNumber я хочу объединить записи, которые следующие ( по метке времени) непосредственно друг за другом. Я хочу объединять строки только в том случае, если они имеют одинаковые значения в Activity, ColB и Col C и когда разница во времени между отметкой времени завершения и начала находится под определенным порогом (например, 30 секунд). Поскольку фрейм данных уже отсортирован, наиболее очевидной идеей является итерация по строкам и объединение каждых 2 строк, соответствующих условиям. Например, отбросив одну строку и установив новую метку Timestamp_complete на оставшуюся.

Но итерация - это плохая идея в pandas ...

Есть ли другая идея сделать это?
Спасибо!

1 Ответ

0 голосов
/ 02 февраля 2020

Обновлено за комментарий и изменение вопроса:

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

Activitygrp = (df['Activity'] != df['Activity'].shift().bfill()).cumsum().rename('ActivityGroup')
df_m = (df.groupby(['SessionNumber', 'Activity', Activitygrp, 'ColB', 'ColC'])[['Timestamp_start', 'Timestamp_complete']]
          .agg(Time_start=('Timestamp_start', 'first'),
               Time_end=('Timestamp_complete', 'last')))
df_m.reset_index()

Вывод:

|    |   SessionNumber | Activity   |   ActivityGroup |   ColB |   ColC | Time_start          | Time_end            |
|---:|----------------:|:-----------|----------------:|-------:|-------:|:--------------------|:--------------------|
|  0 |               2 | "A"        |               0 |      3 |      4 | 2018-02-11 14:17:00 | 2018-02-11 14:28:30 |
|  1 |               2 | "A"        |               2 |      3 |      4 | 2018-02-11 14:33:00 | 2018-02-11 14:35:30 |
|  2 |               2 | "B"        |               1 |      3 |      4 | 2018-02-11 14:29:00 | 2018-02-11 14:31:30 |
|  3 |               3 | "A"        |               2 |      2 |      1 | 2018-02-12 08:44:00 | 2018-02-12 08:51:30 |
...