我有下面的数据框,该数据框按用户和时间戳进行排序(此处写为整数以便于使用)。
我添加了一个列,该列使用熊猫diff()以分钟为单位提供了与上一个活动的时差。我将动作定义为属于同一会话,如果它们在30分钟之内发生。这样,查找新会话很容易,因为我可以看看timediff是否等于“ NaT”或大于30。
d = {'id': [123, 123, 123, 123, 123, 123, 234, 234],
'activity': ['view','click','click','view','click','view', 'click', 'view'],
'timestamp': [1, 2,3,4,5,6,1,2],
'timediff_min': ['NaT',1,36,2,6,124,'NaT',1],
'new_session': [1,0,1,0,0,1,1,0]}
df = pd.DataFrame(d)
df
这将产生“ new_session”列。现在我可以过滤以获取具有会话开始时间戳的数据帧,但是我想获取时间戳 最终活动的数量,以能够计算会话时长。因此,基本上,如果有一个活动会话开始时间和会话结束时间相同,但是如果同一会话中有多个活动,则会话开始将是第一个活动,会话结束将是最后一个活动。下一个会话开始。所以最终输出将是这样的
d2 = {'id': [123, 123, 123, 234, ],
'activity': ['view','click','view', 'click'] ,
'timestamp': [1, 3,6,1],
'timediff_min': ['NaT',36,124,'NaT'],
'new_session': [1,1,1,1,],
'session_start': [1,3,6,1],
'session_end': [2,5,6,2],}
pd.DataFrame(d2)
任何帮助将不胜感激。谢谢!
答案 0 :(得分:0)
我通过以下方法解决了这个问题
d['time_diff'] = d.groupby('id')['timestamp'].diff()
d['new_sess'] = np.where((d.time_diff.isnull()) | (d.time_diff > 'P0DT0H30M0S'), 'yes', 'no')
new_sessions = np.where((d.time_diff.isnull()) | (d.time_diff > 'P0DT0H30M0S'))
d['sess_count'] = np.NaN
d.iloc[new_sessions[0],9] = new_sessions[0]
d.fillna(method='ffill', inplace = True)
d['sess_id'] = d.id + '-' + d.sess_count.astype(int).astype(str)
这将创建唯一的会话ID,然后我可以将其分组以获取最小和最大时间戳。