使用熊猫根据timedelta值创建新的唯一会话ID

时间:2018-12-04 08:50:04

标签: python pandas

我有一个DataFrame,其中包含用于网站上客户点击的特定会话ID,以及实际点击与该点击之间的时差。意思是,第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中使用熊猫。

/尼古拉

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这是一种方法:

首先查找日期差小于所建立的1天阈值的条目:

cond1 = ~(df.delta_t.shift(1).abs() < pd.to_timedelta('1 day'))

寻找session ID发生变化的索引:

cond2 = df.session.diff().fillna(0).ne(0).shift(-1)

在检查是否满足两个条件之一后应用cumsum,即,即使时间差不小于1天,如果{{1} } ID不同:

new_session