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 |
我有一个已排序的 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 |