python - 使用 pandas 从 timedelta-values 创建新的唯一会话 ID
问题描述
我有一个 DataFrame,其中包含客户在网站上点击的特定会话 ID,以及 DataFrame 中实际点击和下一次点击之间的时间差。意思是,第 1 行中的 delta_t 是第 1 行和第 2 行之间的时间差。时间差是根据服务器时间计算的。
现在我想根据这些信息创建一个新的 session_ID。这意味着,如果两次点击之间的差异超过某个级别(例如 > 1 天 00:00:00.00),那么它们应该被视为不同的会话。
我的 df 如下所示:
session delta_t
1 11 days 18:59:13.23
1 1 days 02:22:13.23
1 0 days 18:59:13.23
7 1 days 18:59:13.23
7 0 days 07:59:13.23
7 0 days 04:59:13.23
7 2 days 18:59:13.23
新变量还应考虑“会话”,因此即使 delta_t 低于定义的时间级别,如果下一个会话与前一个会话不同,那么它们仍应被视为不同。
我的 df 应该如下所示,阈值为“1 天 00:00:00.00”。
session delta_t new_session
1 11 days 18:59:13.23 1
1 1 days 02:22:13.23 2
1 0 days 18:59:13.23 3
7 1 days 18:59:13.23 4
7 0 days 07:59:13.23 5
7 0 days 04:59:13.23 5
7 2 days 18:59:13.23 5
7 1 days 18:59:13.23 6
我希望这是有道理的,否则只是问。我在 Python 中使用熊猫。
/尼古拉
解决方案
我会在delta_t
列中找到天数,然后创建一个 0/1 列,它代表会话的变化。
之后,new_session
只是的累积总和change_f_sess
import pandas as pd
df=pd.DataFrame({'session':[1,1,1,7],'delta_t':['11 days 18:59:13.23','1 days 02:22:13.23','0 days 18:59:13.23','1 days 18:59:13.23']})
df['days']=df.apply(lambda row: row.delta_t[:row.delta_t.find('d')] , axis = 1).astype(int)
df['days'] = df['days'].shift(1)
df.loc[0,'days'] = 1
df['change_f_sess']=df.apply(lambda row: 1 if row.days > 0 else 0 , axis = 1).astype(int)
df['new_session'] = df['change_f_sess'].cumsum()
print(df)
输出:
delta_t session days change_f_sess new_session
0 11 days 18:59:13.23 1 1.0 1 1
1 1 days 02:22:13.23 1 11.0 1 2
2 0 days 18:59:13.23 1 1.0 1 3
3 1 days 18:59:13.23 7 0.0 0 3
推荐阅读
- android - 嵌套 Recyclerview 使滚动滞后
- java - 使用 FilterInvocationSecurityMetadataSource 的 Spring 安全动态授权和身份验证
- python - 必需的位置参数:“num_features”错误
- java - maven-resources-plugin 覆盖输出目录不起作用
- java - Lombok 无法在 Linux 上自行安装的 STS 中工作——为什么我的构造函数无法识别 @Builder 注释
- c# - 如何测试 ASP.NET MVC 控制器并查看
- python - 将多个py更改为exe
- elixir - 如果 ecto 的 preload 为零,则创建空的 has_one 关联
- python - 在多个进程之间共享 Python dict
- python - Pyrebase:从第二个 get().val() 返回 None