首页 > 解决方案 > 使用 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 中使用熊猫。

/尼古拉

标签: pythonpandas

解决方案


我会在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

推荐阅读