我有一个具有以下结构的数据框:
我需要为每个唯一的 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 的行,我们看到:
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,
)