如何根据熊猫的时差为用户设置会话

Posted

技术标签:

【中文标题】如何根据熊猫的时差为用户设置会话【英文标题】:How to set session for user basing on time difference in pandas 【发布时间】:2019-07-17 21:57:58 【问题描述】:

我有一个具有这种结构的数据框(按 user_id、事件时间排序):

用户 ID 事件时间(以毫秒为单位) 每个 user_id 的先前事件和当前事件之间的时间差(以秒为单位)

例如 user_1 1550844324011 - 用户 1 1550844504351 180

user_2 1550807681932 - 用户_2 1550807780002 98 user_2 1550809800005 2020 用户_2 1550819800005 10000

然后我想在新列中为每个 user_id 设置会话 ID。接下来是逻辑:如果事件之间的时间差超过 900 秒,那么我应该为用户设置新的 session_id。所以结果应该是下一个:

user_1 1550844324011 - 1 user_1 1550844504351 180 1

user_2 1550807681932 - 1 用户_2 1550807780002 98 1 用户_2 1550809800005 2020 2 用户_2 1550819800005 10000 3

我怎样才能正确地做到这一点?请帮帮我。 谢谢

【问题讨论】:

【参考方案1】:

这应该可以工作

# Sorting is needed, otherwise .diff() will output wrong results
df = df.sort_values(['user_id', 'timestamp'])

# Timestamp diff in seconds
diff_timestamp = df.groupby('user_id')['timestamp'].diff() / 1000

# indexes where new session_id will be created
new_session = (diff_timestamp.isnull()) | (diff_timestamp > 900)

# Create unique session_id for every user
df['session_id'] = df.loc[new_session, ['user_id', 'timestamp']] \
    .groupby('user_id').rank(method='first').astype(int)

# Propagate last valid observation forward (replace NaN)
df['session_id'] = df['session_id'].fillna(method='ffill').astype(int)


在small talk 之后,如果使用.diff(),请确保该列是数字!

【讨论】:

感谢您的帮助!但是第二行“diff_timestamp = df.groupby('user_id').diff()['timestamp']”有问题。发生错误 'df['session_id'] = df[new_session].groupby('user_id').rank(method='first').astype(int)' - ' 'NoneType' 对象不可调用'。无法理解原因 你能把你的数据集上传到某个地方吗?您使用的是哪个熊猫版本? pd.__version__ 已上传数据集样本drive.google.com/file/d/1k865mUyiBd0ohhs5ezDxwgCmJ3qph6PP/…。 Pandas 版本为 0.23

以上是关于如何根据熊猫的时差为用户设置会话的主要内容,如果未能解决你的问题,请参考以下文章

根据条件组合熊猫行[重复]

如何从表中获取通知给会话用户

windows server 2012 如何设置远程登录同时多用户登录

使用会话 ID 取消设置特定会话

如何使用熊猫按组计算时差?

Keycloak SSO 会话最大值 = 0?