Pandas高效实现:合并列中连续重复值的行并支持时间阈值
高效合并生产线中断事件DataFrame的向量化方案
针对同一中断原因(RSNNAME)的连续事件被拆分为多行的问题,我们可以用pandas的向量化操作替代iterrows循环,大幅提升处理效率,同时支持15分钟的时间间隔阈值判断。以下是具体实现步骤:
前置准备
首先确保时间列是datetime类型,并按中断原因和时间排序(保证连续事件的时序正确性):
import pandas as pd # 转换时间列为datetime类型 df['BEGTIME'] = pd.to_datetime(df['BEGTIME']) df['ENDTIME'] = pd.to_datetime(df['ENDTIME']) # 按中断原因、开始时间排序,确保事件按时间顺序排列 df = df.sort_values(by=['RSNNAME', 'BEGTIME'])
生成事件分组标识
通过向量化计算,给需要合并的连续事件分配同一组ID:
# 按RSNNAME分组,计算当前事件开始时间与上一事件结束时间的间隔 df['interval'] = df.groupby('RSNNAME')['BEGTIME'] - df.groupby('RSNNAME')['ENDTIME'].shift(1) # 标记新事件组:间隔超过15分钟,或为组内第一个事件(间隔为NaN) df['new_group'] = (df['interval'] > pd.Timedelta(minutes=15)) | df['interval'].isna() # 按RSNNAME分组累加新组标记,生成唯一组ID df['group_id'] = df.groupby('RSNNAME')['new_group'].cumsum()
按组聚合合并事件
最后按RSNNAME和group_id聚合,取每组的首行开始时间、末行结束时间:
# 聚合生成合并后的事件数据 merged_df = df.groupby(['RSNNAME', 'group_id']).agg( BEGTIME=('BEGTIME', 'first'), ENDTIME=('ENDTIME', 'last') ).reset_index(drop=True)
方案优势
整个流程完全基于pandas的内置向量化操作,避免了逐行迭代的低效问题。在大数据量场景下(如十万级以上数据),处理速度比iterrows快数十倍甚至上百倍,同时代码简洁易维护。
内容的提问来源于stack exchange,提问作者Valtteri Valo
相关产品推荐
相关产品推荐

