【问题标题】:Pandas filter out events that do not take place within x amount of time of each otherPandas 过滤掉彼此间隔 x 时间内未发生的事件
【发布时间】:2022-01-07 04:21:26
【问题描述】:

我有一个用户事件的数据框,我想保留在给定时间(例如 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 小时内发生。我一直在搜索 stackoverflow 问题,但似乎没有什么适合这种情况。任何帮助将不胜感激!

编辑:在Time difference between two event rows for each user in Pandas df 之后,我正在计算按用户分组的行之间的时间差。

【问题讨论】:

    标签: python pandas dataframe time-series


    【解决方案1】:
    1. timestamp排序:

      df = df.sort_values('timestamp')
      
    2. groupby user+store 并检查时间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
      
    3. 使用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
      

    【讨论】:

      猜你喜欢
      • 2021-05-19
      • 2022-07-05
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 2021-01-11
      • 2018-08-13
      • 1970-01-01
      相关资源
      最近更新 更多