【问题标题】:Pandas - How to merge 2 related events in one linePandas - 如何在一行中合并 2 个相关事件
【发布时间】:2020-04-14 22:13:16
【问题描述】:

我每天都有这样的用户登录/注销数据:

date,user,action
2020-04-14 01:00:00,user1,login
2020-04-14 01:05:00,user2,login
2020-04-14 01:10:00,user3,login
2020-04-14 02:40:00,user2,logout
2020-04-14 02:50:00,user3,logout
2020-04-14 03:10:00,user2,login
2020-04-14 03:10:00,user1,logout
2020-04-14 03:30:00,user3,login
2020-04-14 04:20:00,user2,logout

用户可以在一天内多次登录/注销。会话关闭,然后新会话打开。 (如用户2) 我需要获取每个会话的持续时间,并且没有会话 ID。

如何将这两个事件合并为一行:登录和登录后第一次注销。像这样:

login_date,logout_date,user
2020-04-14 01:00:00,2020-04-14 03:10:00,user1
2020-04-14 01:05:00,2020-04-14 02:40:00,user2
2020-04-14 01:10:00,2020-04-14 02:50:00,user3
2020-04-14 03:10:00,2020-04-14 04:20:00,user2
2020-04-14 03:30:00,-,user3

【问题讨论】:

  • 如果用户已注销但未登录,预期的行为是什么?或者这会是数据中的错误而不是预期的吗?
  • login_date 可以为空。我可以用 00:00:00 填写 login_date。

标签: python pandas


【解决方案1】:

IIUC:

(df.assign(row=lambda x: df.action.eq('login').groupby(df['user']).cumsum())
   .pivot_table(index=['row','user'], columns='action', values='date', aggfunc='first')
   .reset_index('row', drop=True)
   .reset_index()
)

输出:

action   user                login               logout
0       user1  2020-04-14 01:00:00  2020-04-14 03:10:00
1       user2  2020-04-14 01:05:00  2020-04-14 02:40:00
2       user3  2020-04-14 01:10:00  2020-04-14 02:50:00
3       user2  2020-04-14 03:10:00  2020-04-14 04:20:00
4       user3  2020-04-14 03:30:00                  NaN

【讨论】:

  • 这样可以处理用户登录但未退出的情况吗?
猜你喜欢
  • 2022-08-17
  • 1970-01-01
  • 2023-02-09
  • 1970-01-01
  • 2022-11-28
  • 2021-10-24
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多