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

如何在Pandas DataFrame中识别并提取指定连续事件模式?

识别并提取Pandas DataFrame中的连续事件模式

针对你提出的需求——从事件序列DataFrame中识别并提取两种连续事件模式的片段,我整理了两种优雅的实现方式,逻辑清晰且易于维护:

先准备基础数据

首先我们先初始化你提供的DataFrame和要匹配的两个模式:

import pandas as pd

# 初始化目标DataFrame
df = pd.DataFrame({
    "event": [
        "Search Executed", "Search Results Returned", "Result List Clicked", 
        "Result List Clicked", "Document Action", "Result List Clicked", 
        "Returned Results", "Search Results Returned", "Result List Clicked", 
        "Preview", "Open", "Search Executed", "Returned Results", "Document Action"
    ]
})

# 定义需要匹配的两个连续事件模式
pattern1 = ["Search Executed", "Search Results Returned", "Result List Clicked"]
pattern2 = ["Search Executed", "Returned Results", "Document Action"]

方法一:滑动窗口匹配法

利用Pandas的rolling滑动窗口功能,将连续3个事件转为元组,直接和模式元组做匹配,定位到匹配的起始位置后提取片段:

# 创建长度为3的滑动窗口,将窗口内的事件转为元组(raw=True保证传入原始值)
windowed_events = df['event'].rolling(window=3).apply(lambda x: tuple(x), raw=True).dropna()

# 找到匹配两个模式的窗口索引,再转换为片段的起始索引(窗口索引=起始索引+2)
match_starts1 = windowed_events[windowed_events == tuple(pattern1)].index - 2
match_starts2 = windowed_events[windowed_events == tuple(pattern2)].index - 2

# 收集所有匹配的片段
result_frames = []
for start_idx in match_starts1:
    result_frames.append(df.loc[start_idx:start_idx+2])
for start_idx in match_starts2:
    result_frames.append(df.loc[start_idx:start_idx+2])

# 输出结果
for idx, frame in enumerate(result_frames, 1):
    print(f"输出{idx}:")
    print(frame)
    print("-" * 35)

方法二:布尔掩码定位法

通过shift()方法关联当前行与前两行的事件,生成布尔掩码直接定位到模式的结束位置,再反向提取片段:

# 生成匹配模式1的布尔掩码(匹配模式的最后一行)
mask1 = (df['event'] == pattern1[2]) & \
        (df['event'].shift(1) == pattern1[1]) & \
        (df['event'].shift(2) == pattern1[0])

# 生成匹配模式2的布尔掩码
mask2 = (df['event'] == pattern2[2]) & \
        (df['event'].shift(1) == pattern2[1]) & \
        (df['event'].shift(2) == pattern2[0])

# 合并所有匹配的结束索引
end_indices = pd.concat([mask1[mask1].index, mask2[mask2].index])

# 提取每个匹配的片段
result_frames = [df.loc[idx-2:idx] for idx in end_indices]

# 输出结果
for idx, frame in enumerate(result_frames, 1):
    print(f"输出{idx}:")
    print(frame)
    print("-" * 35)

这两种方法都能精准提取你需要的片段,其中方法二更直观,不需要额外处理滑动窗口的索引转换;如果需要扩展更多模式,只需要新增对应的掩码或模式元组即可,非常灵活。

内容的提问来源于stack exchange,提问作者supratim saha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:02:28