Combine/Merge 排序的 pandas 数据帧中的时间间隔行

Combine/Merge time interval rows in a sorted pandas dataframe

我有一个已排序的 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 和 ColC 中具有相同的值时,以及当完成时间戳和开始时间戳之间的时间差低于某个阈值(例如 30 秒)时。 由于数据框已经排序,最明显的想法是遍历行并组合每 2 行符合条件的行。例如,删除一行并将新的 Timestamp_complete 设置为剩余的一行。

但是在 pandas...

中迭代是个坏主意

还有其他的想法吗?
谢谢!

根据评论和问题的变化更新:

试试这个:

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 |