如何根据pandas中的时差为用户设置会话

问题描述 投票:1回答:1

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

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

例如 user_1 1550844324011 - user_1 1550844504351 180

user_2 1550807681932 - user_2 1550807780002 98 user_2 1550809800005 2020 user_2 1550819800005 10000

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

user_1 1550844324011 - 1 user_1 1550844504351 180 1

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

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

python pandas jupyter-notebook analytics data-mining
1个回答
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)

Unique session ID by timestamp and user ID


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

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.