如何根据 pandas 中的时差为用户设置会话
How to set session for user basing on time difference in pandas
我有一个具有这种结构的数据框(按 user_id 排序,事件发生时间):
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
我怎样才能正确地做到这一点?请帮帮我。
谢谢
这应该有效
# 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()
,请确保该列是数字!
我有一个具有这种结构的数据框(按 user_id 排序,事件发生时间):
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
我怎样才能正确地做到这一点?请帮帮我。 谢谢
这应该有效
# 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()
,请确保该列是数字!