You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 16:45:04