Pandas 过滤掉未在彼此 x 时间量内发生的事件
Pandas filter out events that do not take place within x amount of time of each other
我有一个用户事件数据框,我想保留在给定时间(例如 2 小时)内发生的所有事件,这些事件与同一用户和同一商店相关联。这是一个示例数据框:
user_id
timestamp
store_id
user_1
2021-11-26T13:40:00.000Z
store_1
user_1
2021-11-26T12:20:00.000Z
store_1
user_1
2021-11-22T16:10:00.000Z
store_1
user_2
2021-11-19T22:00:00.000Z
store_2
user_2
2021-11-19T19:50:00.000Z
store_2
user_3
2021-11-28T06:10:00.000Z
store_1
user_4
2021-11-18T16:30:00.000Z
store_3
user_4
2021-11-18T16:20:00.000Z
store_2
应用过滤,输出数据帧应如下所示:
user_id
timestamp
store_id
user_1
2021-11-26T13:40:00.000Z
store_1
user_1
2021-11-26T12:20:00.000Z
store_1
因为只有 user_1
的前两个事件发生在同一家商店,同一位用户,并且彼此相隔不到 2 小时。我一直在搜索 Whosebug 问题,但似乎没有什么适合这种情况。任何帮助将不胜感激!
编辑:在 之后,我正在计算行之间的时间差,按用户分组。
排序方式 timestamp
:
df = df.sort_values('timestamp')
groupby
the user+store and check if the time diff
(向前或向后)在指定的范围内 delta
:
(请注意,keep
此处显示为一列仅用于说明目的。此代码实际上并未将其添加为一列,但将其设为一列也无妨如果愿意的话。)
delta = pd.Timedelta('2H')
keep = (df.groupby(['user_id', 'store_id'], sort=False)['timestamp']
.transform(lambda g: g.diff().abs().le(delta) | g.diff(-1).abs().le(delta)))
# user_id timestamp store_id keep
# 7 user_4 2021-11-18 16:20:00+00:00 store_2 False
# 6 user_4 2021-11-18 16:30:00+00:00 store_3 False
# 4 user_2 2021-11-19 19:50:00+00:00 store_2 False
# 3 user_2 2021-11-19 22:00:00+00:00 store_2 False
# 2 user_1 2021-11-22 16:10:00+00:00 store_1 False
# 1 user_1 2021-11-26 12:20:00+00:00 store_1 True
# 0 user_1 2021-11-26 13:40:00+00:00 store_1 True
# 5 user_3 2021-11-28 06:10:00+00:00 store_1 False
过滤 loc
或切片:
df.loc[keep] # or df[keep]
# user_id timestamp store_id
# 1 user_1 2021-11-26 12:20:00+00:00 store_1
# 0 user_1 2021-11-26 13:40:00+00:00 store_1
我有一个用户事件数据框,我想保留在给定时间(例如 2 小时)内发生的所有事件,这些事件与同一用户和同一商店相关联。这是一个示例数据框:
user_id | timestamp | store_id |
---|---|---|
user_1 | 2021-11-26T13:40:00.000Z | store_1 |
user_1 | 2021-11-26T12:20:00.000Z | store_1 |
user_1 | 2021-11-22T16:10:00.000Z | store_1 |
user_2 | 2021-11-19T22:00:00.000Z | store_2 |
user_2 | 2021-11-19T19:50:00.000Z | store_2 |
user_3 | 2021-11-28T06:10:00.000Z | store_1 |
user_4 | 2021-11-18T16:30:00.000Z | store_3 |
user_4 | 2021-11-18T16:20:00.000Z | store_2 |
应用过滤,输出数据帧应如下所示:
user_id | timestamp | store_id |
---|---|---|
user_1 | 2021-11-26T13:40:00.000Z | store_1 |
user_1 | 2021-11-26T12:20:00.000Z | store_1 |
因为只有 user_1
的前两个事件发生在同一家商店,同一位用户,并且彼此相隔不到 2 小时。我一直在搜索 Whosebug 问题,但似乎没有什么适合这种情况。任何帮助将不胜感激!
编辑:在
排序方式
timestamp
:df = df.sort_values('timestamp')
groupby
the user+store and check if the timediff
(向前或向后)在指定的范围内delta
:(请注意,
keep
此处显示为一列仅用于说明目的。此代码实际上并未将其添加为一列,但将其设为一列也无妨如果愿意的话。)delta = pd.Timedelta('2H') keep = (df.groupby(['user_id', 'store_id'], sort=False)['timestamp'] .transform(lambda g: g.diff().abs().le(delta) | g.diff(-1).abs().le(delta))) # user_id timestamp store_id keep # 7 user_4 2021-11-18 16:20:00+00:00 store_2 False # 6 user_4 2021-11-18 16:30:00+00:00 store_3 False # 4 user_2 2021-11-19 19:50:00+00:00 store_2 False # 3 user_2 2021-11-19 22:00:00+00:00 store_2 False # 2 user_1 2021-11-22 16:10:00+00:00 store_1 False # 1 user_1 2021-11-26 12:20:00+00:00 store_1 True # 0 user_1 2021-11-26 13:40:00+00:00 store_1 True # 5 user_3 2021-11-28 06:10:00+00:00 store_1 False
过滤
loc
或切片:df.loc[keep] # or df[keep] # user_id timestamp store_id # 1 user_1 2021-11-26 12:20:00+00:00 store_1 # 0 user_1 2021-11-26 13:40:00+00:00 store_1