如何为DataFrame生成标识列:同Unique_ID状态CLOSED超2小时标记为True
实现方法
核心思路是先识别每个ID下连续的CLOSED状态段,再计算每段的时长判断是否满足阈值,整体实现步骤如下:
前置处理
首先确保时间字段为datetime类型,且每个ID下的记录按时间正序排列:
import pandas as pd # 转换时间列格式 df['Time'] = pd.to_datetime(df['Time']) # 按ID+时间排序,保证时序正确 df = df.sort_values(by=['Unique_ID', 'Time'], ignore_index=True)
识别连续状态段
给每个ID下的连续相同Status标记相同的段编号:
# 状态发生变化时标记为新的段 df['segment_id'] = df.groupby('Unique_ID')['Status'].transform( lambda x: x.ne(x.shift()).cumsum() )
计算连续段时长并生成flag
# 按ID、状态、段ID分组,计算每段的最大最小时间差 seg_df = df.groupby(['Unique_ID', 'Status', 'segment_id'], as_index=False)['Time'].agg(['min', 'max']) seg_df['duration_hour'] = (seg_df['max'] - seg_df['min']).dt.total_seconds() / 3600 # 提取所有存在CLOSED状态持续超过2小时的ID target_ids = seg_df.loc[ (seg_df['Status'] == 'CLOSED') & (seg_df['duration_hour'] > 2), 'Unique_ID' ].unique() # 给原始表打flag,如需布尔类型可去掉.astype(str) df['flag'] = df['Unique_ID'].isin(target_ids).astype(str)
可选优化
如果仅需要每个ID对应一条flag结果,不需要保留原始明细行,可最后执行:
result = df[['Unique_ID', 'flag']].drop_duplicates()
内容的提问来源于stack exchange,提问作者Dreamer12
相关产品推荐
相关产品推荐

