我有一个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中使用熊猫。
/尼古拉
答案 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