使用pandas滚动窗口按唯一ID统计特定条件事件的实现方法
解决思路
完全可以拆分多步生成中间列实现,比嵌套复杂滚动lambda的可读性高很多,实现步骤如下:
第一步:基础数据预处理
- 将
timestamp列转为pandas datetime类型,设置为DataFrame的索引,保证滚动时间窗口可以正常工作 - 生成第一个中间列
is_valid_event:标记当前行event是否为需要统计的full/partial事件,符合条件为True,否则为False
第二步:按ID分组做滚动统计
- 按
id字段分组,对每个ID单独做1分钟滚动窗口统计 - 生成第二个中间列
valid_event_count_in_window:统计当前行往前推1分钟的窗口内,该ID累计出现的有效事件数量
第三步:计算最终counter列
直接用两个中间列做逻辑判断即可:
- 如果
is_valid_event为False,counter直接取0 - 如果
is_valid_event为True,且valid_event_count_in_window等于1,说明是当前窗口内该ID的首次有效事件,counter取1,否则取0
可直接运行的完整代码
import pandas as pd # 构造示例数据 data = [ ['2021-10-26 10:00:00.000', 1, 'full'], ['2021-10-26 10:00:01.000', 2, 'partial'], ['2021-10-26 10:00:03.090', 3, 'full'], ['2021-10-26 10:00:05.090', 2, 'partial'], ['2021-10-26 10:00:05.590', 4, 'event_z'], ['2021-10-26 10:00:05.690', 4, 'event_z'], ['2021-10-26 10:00:05.790', 4, 'event_b'], ] df = pd.DataFrame(data, columns=['timestamp', 'id', 'event']) # 预处理时间格式和索引 df['timestamp'] = pd.to_datetime(df['timestamp']) df = df.set_index('timestamp').sort_index() # 生成中间列1:标记有效事件 df['is_valid_event'] = df['event'].isin(['full', 'partial']) # 生成中间列2:分组滚动统计窗口内有效事件数 df['valid_event_count_in_window'] = df.groupby('id')['is_valid_event'].rolling('1min').sum().reset_index(level=0, drop=True) # 计算最终counter df['counter'] = ((df['is_valid_event']) & (df['valid_event_count_in_window'] == 1)).astype(int) # 恢复timestamp为普通列,和示例输出格式对齐 df = df.reset_index() print(df)
运行后输出结果和你给出的目标样例完全一致。
内容的提问来源于stack exchange,提问作者LaGabriella
相关产品推荐
相关产品推荐

