【问题标题】:How to select the last x days before a specific event?如何选择特定事件前的最后 x 天?
【发布时间】:2019-07-26 22:41:32
【问题描述】:

我有一个包含以下列的 pandas 数据框:

  • id - 类别
  • 时间戳 - 日期时间
  • 事件 - 类别

我想为每个设备创建一个窗口函数,该函数返回另一个数据框,其中包含特定事件前 x 天发生的所有事件。
例如:

Id   Timestamp    Event   
123   2018-11-01  click_page1
123   2018-12-24  buy   
123   2018-05-23  click_page2
133   2018-12-25  sign_in
133   2018-12-28  buy
133   2018-10-15  click

我想定义一个函数 filter_window(df, event_name, position, window) 其中 position 可以是事件的第一次或最后一次,window 是自该事件时间以来的天数。

【问题讨论】:

  • 你有没有尝试过?

标签: python pandas


【解决方案1】:

基本上你想根据位置和窗口确定开始和结束日期,然后使用这些边界过滤你的数据框。

首先要了解 pandas 日期时间格式 - 请查看文档以了解更多详细信息。

def filter_window(df, event_name, position, window):
    if position = 'first':
        end_date = df.loc[(df.Event = event_name),'Timestamp'].min()
    else:
        end_date = df.loc[(df.Event = event_name),'Timestamp'].max()
    start_date = end_date - pd.Timedelta(days=window)
    return df[(df.Timestamp >= start_date)&(df.Timestamp <= end_date)]

编辑:这段代码显然需要适应您的需要。例如:

for i in list(set(df.Id)):
    df1 = df.loc[df.Id = i]

这是一个 for 循环,它为每个不同的 Id 创建一个数据帧。然后,您可以在该数据帧上使用 filter_window 函数来获取您需要的内容。

【讨论】:

  • 如果您只想过滤最小或最大事件日期,这个想法非常有效。但我有兴趣在 每个 id 的事件前过滤 x 天。这意味着最小/最大日期不能跨越整个数据帧,而是每个 id 的最小/最大日期
  • 请查看编辑。根据我掌握的有限信息,我不知道我还能为您做多少:S
  • 为了获得我想要的结果,我通过按“id”分组更改了您的代码df2 = df.loc[(df.event == event_name)].groupby('id').agg({'timestamp': 'min'})
猜你喜欢
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 2020-12-21
  • 2014-08-11
  • 1970-01-01
  • 2019-01-20
相关资源
最近更新 更多