【发布时间】:2016-12-08 04:29:28
【问题描述】:
我有按 id 发生的事件表。如何计算在当前行之前每个事件类型在过去 n 天内发生的次数?
例如有一个事件列表,例如:
df = pd.DataFrame([{'id': 1, 'event_day': '2016-01-01', 'event_type': 'type1'},
{'id': 1, 'event_day': '2016-01-02', 'event_type': 'type1'},
{'id': 2, 'event_day': '2016-02-01', 'event_type': 'type2'},
{'id': 2, 'event_day': '2016-02-15', 'event_type': 'type3'},
{'id': 3, 'event_day': '2016-01-06', 'event_type': 'type3'},
{'id': 3, 'event_day': '2016-03-11', 'event_type': 'type3'},])
df['event_day'] = pd.to_datetime(df['event_day'])
df = df.sort_values(['id', 'event_day'])
或:
event_day event_type id
0 2016-01-01 type1 1
1 2016-01-02 type1 1
2 2016-02-01 type2 2
3 2016-02-15 type3 2
4 2016-01-06 type3 3
5 2016-03-11 type3 3
by id 我想计算过去 n 天内每个 event_type 在当前行之前发生的次数。例如,在第 3 行 id=2 中,那么在事件历史记录中的该点之前(但不包括)有多少次事件类型 1、2 和 3 在过去 n 天内针对 id 2 发生?
所需的输出如下所示:
event_day event_type event_type1_in_last_30days event_type2_in_last_30days event_type3_in_last_30days id
0 2016-01-01 type1 0 0 0 1
1 2016-01-02 type1 1 0 0 1
2 2016-02-01 type2 0 0 0 2
3 2016-02-15 type3 0 1 0 2
4 2016-01-06 type3 0 0 0 3
5 2016-03-11 type3 0 0 0 3
【问题讨论】:
-
您的预期输出的最后一行不应该是过去 30 天的事件计数全为零吗?倒数第二行是 id 3 的唯一另一行,
event_day值相隔超过 30 天。 -
@root 你是对的。已更新。
-
这两种方法都很好用。我在一个包含大约 10k 行的更大数据集上进行了测试,ayhan 的方法大约是 5 倍(3 秒对 15 秒),但两者都是可行的。我在示例中未能展示的一件事是 event_day 不是唯一的,因此合并并不能很好地工作 juanpa.arrivillaga,但我只是连接了两个 dfs,它工作正常。而且,两者相互匹配。