如何筛选On Hold Begins事件及后续紧邻事件并重构DataFrame
生成包含On Hold Begins及其紧邻后续事件的DataFrame
我来帮你搞定这个需求,用Pandas就能轻松实现。假设你的原始数据已经是按时间顺序排列的DataFrame(列名比如Event、Timestamp、Deviation),我们可以分步骤处理:
步骤1:为每个On Hold Begins事件划分组
首先,我们需要把每个以On Hold Begins开头的事件片段单独分组,这样能方便我们只处理符合要求的片段(排除前两行非On Hold Begins开头的部分):
import pandas as pd # 假设你的原始数据存储在df中 df['group_id'] = (df['Event'] == 'On Hold Begins').cumsum()
这行代码会给每个On Hold Begins事件分配一个递增的组ID,所有在两个On Hold Begins之间的事件会被归到同一个组里,而前两行非On Hold Begins的事件会被分到group_id=0的组中。
步骤2:筛选每个组的前两行(On Hold Begins + 紧邻后续事件)
接下来,我们只保留每个组的前两行——第一行是On Hold Begins,第二行就是它的紧邻后续事件:
# 提取每个组的前两行数据 grouped_data = df.groupby('group_id').head(2)
步骤3:将两行数据合并为一行,整理成目标格式
现在我们把每个组的两行数据合并成一行,分别提取On Hold Begins和后续事件的时间戳、偏差值:
# 聚合每个组的数据,生成目标列 result_df = grouped_data.groupby('group_id').agg( on_hold_timestamp=('Timestamp', lambda x: x.iloc[0]), on_hold_deviation=('Deviation', lambda x: x.iloc[0]), next_event=('Event', lambda x: x.iloc[1] if len(x) >= 2 else None), next_timestamp=('Timestamp', lambda x: x.iloc[1] if len(x) >= 2 else None), next_deviation=('Deviation', lambda x: x.iloc[1] if len(x) >= 2 else None) ).reset_index(drop=True) # 排除没有后续事件的On Hold Begins行(比如最后一行是On Hold Begins的情况) result_df = result_df.dropna(subset=['next_event']) # 排除前两行所在的group_id=0的组 result_df = result_df[result_df['on_hold_timestamp'].isin(df[df['Event'] == 'On Hold Begins']['Timestamp'])]
最终结果说明
处理后的result_df会包含以下列:
on_hold_timestamp:On Hold Begins事件的时间戳on_hold_deviation:On Hold Begins事件的偏差值next_event:紧邻On Hold Begins的后续事件名称(比如Below Threshold、Stage Enabled)next_timestamp:后续事件的时间戳next_deviation:后续事件的偏差值
而且自动排除了前两行非On Hold Begins开头的片段,完全符合你的需求。
内容的提问来源于stack exchange,提问作者longlivebrew
相关产品推荐
相关产品推荐

