Pandas 从日志数据创建会话号
Pandas create session number from log data
我有一个带有时间戳、用户 ID、操作的日志数据。
我想根据以下规则创建会话 ID:
如果用户在 30 分钟内没有执行任何操作,它应该为下一个操作启动一个新的会话 ID。
因此对于以下数据框:
ts
userID
action
2020-05-23 00:01:19
user1
action1
2020-05-23 00:05:19
user1
action2
2020-05-23 00:35:19
user1
action3
2020-05-23 01:51:19
user1
action4
2020-05-23 00:01:19
user2
action1
2020-05-23 00:05:19
user2
action2
2020-05-23 00:35:19
user2
action3
2020-05-23 00:51:19
user2
action4
以下
ts
userID
action
SessionID
2020-05-23 00:01:19
user1
action1
1
2020-05-23 00:05:19
user1
action2
1
2020-05-23 00:15:19
user1
action3
1
2020-05-23 00:51:19
user1
action4
2
2020-05-23 00:01:19
user2
action1
1
2020-05-23 00:05:19
user2
action2
1
2020-05-23 00:35:19
user2
action3
1
2020-05-23 00:51:19
user2
action4
1
为用户 1 创建一个新的 sessionID,因为在执行操作时距离上次记录已经超过 30 分钟。但是对于用户 2 没有这样的差距
提前致谢
按 userID
对数据帧进行分组,并针对每组 userID
计算时间戳列上的 diff
,然后将差异与 30
分钟的时间增量进行比较,以创建一个布尔掩码最终使用 cumsum
为每个组创建会话 ID
f = lambda t: t.diff().gt(pd.Timedelta('30T')).cumsum()
df['SessionID'] = df.groupby('userID')['ts'].apply(f) + 1
ts userID action SessionID
0 2020-05-23 00:01:19 user1 action1 1
1 2020-05-23 00:05:19 user1 action2 1
2 2020-05-23 00:35:19 user1 action3 1
3 2020-05-23 01:51:19 user1 action4 2
4 2020-05-23 00:01:19 user2 action1 1
5 2020-05-23 00:05:19 user2 action2 1
6 2020-05-23 00:35:19 user2 action3 1
7 2020-05-23 00:51:19 user2 action4 1
我有一个带有时间戳、用户 ID、操作的日志数据。
我想根据以下规则创建会话 ID:
如果用户在 30 分钟内没有执行任何操作,它应该为下一个操作启动一个新的会话 ID。
因此对于以下数据框:
ts | userID | action |
---|---|---|
2020-05-23 00:01:19 | user1 | action1 |
2020-05-23 00:05:19 | user1 | action2 |
2020-05-23 00:35:19 | user1 | action3 |
2020-05-23 01:51:19 | user1 | action4 |
2020-05-23 00:01:19 | user2 | action1 |
2020-05-23 00:05:19 | user2 | action2 |
2020-05-23 00:35:19 | user2 | action3 |
2020-05-23 00:51:19 | user2 | action4 |
以下
ts | userID | action | SessionID |
---|---|---|---|
2020-05-23 00:01:19 | user1 | action1 | 1 |
2020-05-23 00:05:19 | user1 | action2 | 1 |
2020-05-23 00:15:19 | user1 | action3 | 1 |
2020-05-23 00:51:19 | user1 | action4 | 2 |
2020-05-23 00:01:19 | user2 | action1 | 1 |
2020-05-23 00:05:19 | user2 | action2 | 1 |
2020-05-23 00:35:19 | user2 | action3 | 1 |
2020-05-23 00:51:19 | user2 | action4 | 1 |
为用户 1 创建一个新的 sessionID,因为在执行操作时距离上次记录已经超过 30 分钟。但是对于用户 2 没有这样的差距
提前致谢
按 userID
对数据帧进行分组,并针对每组 userID
计算时间戳列上的 diff
,然后将差异与 30
分钟的时间增量进行比较,以创建一个布尔掩码最终使用 cumsum
为每个组创建会话 ID
f = lambda t: t.diff().gt(pd.Timedelta('30T')).cumsum()
df['SessionID'] = df.groupby('userID')['ts'].apply(f) + 1
ts userID action SessionID
0 2020-05-23 00:01:19 user1 action1 1
1 2020-05-23 00:05:19 user1 action2 1
2 2020-05-23 00:35:19 user1 action3 1
3 2020-05-23 01:51:19 user1 action4 2
4 2020-05-23 00:01:19 user2 action1 1
5 2020-05-23 00:05:19 user2 action2 1
6 2020-05-23 00:35:19 user2 action3 1
7 2020-05-23 00:51:19 user2 action4 1