如何按标签分组提取DataFrame中各动作的起止时间
问题
我有一个包含视频时间(单位:秒)和动作标签的DataFrame,希望为每个标签生成对应的动作起止时间列表。
示例数据:
| Time(sec) | Label |
|---|---|
| 76 | 0 |
| 77 | 0 |
| 78 | 0 |
| 79 | 1 |
| 80 | 1 |
| 81 | 1 |
| 82 | 0 |
| 83 | 0 |
| 84 | 1 |
期望输出格式:
Label_Class_0 = [[76,78],[82,83],...] Label_Class_1 = [[79,81],[84,..],...]
解决方案
利用Pandas的分组功能,先标记连续相同标签的分组,再聚合每组的起止时间,具体实现如下:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'Time(sec)': [76,77,78,79,80,81,82,83,84], 'Label': [0,0,0,1,1,1,0,0,1] }) # 标记连续相同标签的分组 df['group'] = (df['Label'] != df['Label'].shift()).cumsum() # 按标签+分组聚合,提取每组的起止时间 agg_result = df.groupby(['Label', 'group']).agg( start_time=('Time(sec)', 'min'), end_time=('Time(sec)', 'max') ).reset_index() # 整理为期望的格式 label_time_ranges = {} for label in agg_result['Label'].unique(): ranges = agg_result[agg_result['Label'] == label][['start_time', 'end_time']].values.tolist() label_time_ranges[f'Label_Class_{label}'] = ranges # 输出结果 for key, value in label_time_ranges.items(): print(f"{key} = {value}")
运行结果
Label_Class_0 = [[76, 78], [82, 83]] Label_Class_1 = [[79, 81], [84, 84]]
逻辑说明
- 标记连续分组:通过对比当前行标签与上一行标签的差异,生成累计分组号,确保连续相同标签被归为同一组。
- 聚合起止时间:按标签和分组号双重分组,对每组的时间列取最小值(起始时间)和最大值(结束时间)。
- 格式整理:遍历每个标签,提取对应的时间区间列表,转换成期望的变量格式输出。
内容的提问来源于stack exchange,提问作者Hammond
相关产品推荐
相关产品推荐

