【问题标题】:Use Dataframes to identify sessions使用 Dataframes 识别会话
【发布时间】:2019-06-02 04:01:36
【问题描述】:

对于用户分析,我有一个数据库,其中包含事件和每个事件的时间戳。

Timestamp   |   user    |    event code
13:30:23    |   user1   |    event123
13:30:45    |   user1   |    event123
13:30:56    |   user3   |    event123
13:40:15    |   user2   |    event123
13:55:20    |   user1   |    event123

现在我想通过使用会话 ID 注释事件来识别每个用户的“会话”。

每个会话应由用户的一组事件标识,它们之间没有 X 秒(或分钟)的间隔。这意味着事件结束会话后的 X 秒间隔。 每个用户的会话 id 不必从 0 开始,但稍后仅在每个用户的基础上使用。这里设置了 X = 5 分钟。

Timestamp   |   user    |    event code    | session_id
13:30:23    |   user1   |    event123      | 1
13:30:45    |   user1   |    event123      | 1
13:30:56    |   user3   |    event123      | 2
13:40:15    |   user2   |    event123      | 3
13:55:20    |   user1   |    event123      | 4

数据框可以做到这一点吗?

【问题讨论】:

  • 样本数据中的X是什么?
  • 我想了大约 5 分钟。取决于生成的会话的合理程度。

标签: python pandas dataframe data-science


【解决方案1】:

使用GroupBy.ngroup:

#convert to datetimes
df['Timestamp'] = pd.to_datetime(df['Timestamp'])
#identify difference 5Min for each group with cumulative sum
g = (df.groupby('user')['Timestamp'].diff() > pd.Timedelta('5Min')).cumsum()
#create counter of groups
df['session_id'] = df.groupby(['user', g], sort=False).ngroup() + 1
print (df)
            Timestamp   user event code  session_id
0 2019-01-07 13:30:23  user1   event123           1
1 2019-01-07 13:30:45  user1   event123           1
2 2019-01-07 13:30:56  user3   event123           2
3 2019-01-07 13:40:15  user2   event123           3
4 2019-01-07 13:55:20  user1   event123           4

【讨论】:

  • 太棒了!非常感谢。
  • 我已经做过但需要提及的是,“时间戳”字段需要排序,不是吗?
  • @FelixJ。 - 是的,完全正确。如果没有,请使用df = df.sort_values('Timestamp')
猜你喜欢
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
  • 2012-08-03
  • 1970-01-01
  • 2021-05-12
  • 2013-05-25
相关资源
最近更新 更多