计算 Pandas 中某个时间窗口内每种类型事件的发生次数

问题描述 投票:0回答:1

我有一个具有以下结构的数据框:

  • event_timestamp:每个事件的时间戳。
  • event_type:事件类型。

我需要为每个唯一的 event_type 添加一列来计算 该 event_type 的许多事件发生在之前的 10 毫秒窗口内 每行的 event_timestamp。

data = {
    'event_timestamp': [
        '2024-02-01 08:02:09.065315961', '2024-02-01 08:02:09.125612099', '2024-02-01 08:02:09.160326512',
        '2024-02-01 08:02:09.540206541', '2024-02-01 08:02:09.571751697', '2024-02-01 08:02:09.571784060',
        '2024-02-01 08:02:09.574368029', '2024-02-01 08:02:09.574390737', '2024-02-01 08:02:09.578245099',
        '2024-02-01 08:02:10.077399943', '2024-02-01 08:02:10.077424252', '2024-02-01 08:02:10.081648527'
    ],
    'event_type': [
        'A', 'B', 'A', 'A', 'C', 'B', 'A', 'C', 'B', 'A', 'C', 'B'
    ]
}

df = pd.DataFrame(data)
df['event_timestamp'] = pd.to_datetime(df['event_timestamp'])

对于上面的输入,我想要这样的输出:

             event_timestamp         event_type  count_A  count_B  count_C
0  2024-02-01 08:02:09.065315961          A        1        0        0
1  2024-02-01 08:02:09.125612099          B        0        1        0
2  2024-02-01 08:02:09.160326512          A        1        0        0
3  2024-02-01 08:02:09.540206541          A        2        0        0
4  2024-02-01 08:02:09.571751697          C        2        0        1
5  2024-02-01 08:02:09.571784060          B        1        1        0
6  2024-02-01 08:02:09.574368029          A        3        0        0
7  2024-02-01 08:02:09.574390737          C        3        0        1
8  2024-02-01 08:02:09.578245099          B        2        1        0
9  2024-02-01 08:02:10.077399943          A        3        0        0
10 2024-02-01 08:02:10.077424252          C        3        0        1
11 2024-02-01 08:02:10.081648527          B        2        1        0
  • count_A、count_B 和 count_C 列表示每行 event_timestamp 之前 10ms 窗口内发生的 event_type 'A'、'B' 和 'C' 的出现次数。

  • 例如,对于 event_timestamp 2024-02-01 08:02:09.065315961 的行,我们看到:

    • count_A 为 1,因为在该时间戳之前的 10 毫秒窗口内有 1 个类型为“A”的事件。
    • count_B 为 0,count_C 为 0,因为该窗口中没有类型“B”或“C”的事件。
python pandas
1个回答
0
投票

IIUC,您可以使用

get_dummies
生成列,然后在 10 毫秒上执行
rolling.sum
来获取计数:

out = df.merge(pd
   .get_dummies(df['event_type']).add_prefix('count_')
   .set_axis(df['event_timestamp']).sort_index()
   .rolling('10ms').sum().convert_dtypes(),
               left_on='event_timestamp', right_index=True,
)
© www.soinside.com 2019 - 2024. All rights reserved.