【问题标题】:Find days since last event pandas dataframe查找自上次事件熊猫数据框以来的天数
【发布时间】:2017-07-10 21:52:42
【问题描述】:

我有一个熊猫数据框:

df12 = pd.DataFrame({'group_ids':[1,1,1,2,2,2],'dates':['2016-04-01','2016-04-20','2016-04-28','2016-04-05','2016-04-20','2016-04-29'],'event_today_in_group':[1,0,1,1,1,0]})


   group_ids      dates  event_today_in_group
0          1 2016-04-01                     1
1          1 2016-04-20                     0
2          1 2016-04-28                     1
3          2 2016-04-05                     1
4          2 2016-04-20                     1
5          2 2016-04-29                     0

我想计算一个附加列,其中包含每个 group_ids 自上次 event_today_in_group 为 1 以来的天数。

 group_ids      dates  event_today_in_group  days_since_last_event
0          1 2016-04-01                     1                      0
1          1 2016-04-20                     0                     19
2          1 2016-04-28                     1                     27
3          2 2016-04-05                     1                      0
4          2 2016-04-20                     1                     15
5          2 2016-04-29                     0                      9

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    正如我之前提到的,这将为您提供每个组内日期之间的非累积差异:

    df['days_since_last_event'] = df.groupby('group_ids')['dates'].diff().apply(lambda x: x.days)
    

    为了得到这个差值的累积和,根据event_today_in_group的变化,我建议使用shift获取上一行的值,然后生成一个累积和,如下所示:

    df['event_today_in_group'].shift().cumsum()
    

    输出:

    0    NaN
    1    1.0
    2    1.0
    3    2.0
    4    3.0
    5    4.0
    

    这为我们提供了获得累积总和所需的第二个分组值。您可以将上述值分配给一个新列,但如果您只是将它们用于计算,那么您可以简单地将它们包含在随后的 groupby 操作中,如下所示:

    df.loc[:, 'days_since_last_event'] = df.groupby(['group_ids', df['event_today_in_group'].shift().cumsum()])['days_since_last_event'].cumsum()
    

    结果:

       group_ids      dates  event_today_in_group  days_since_last_event
    0          1 2016-04-01                     1                    NaN
    1          1 2016-04-20                     0                   19.0
    2          1 2016-04-28                     1                   27.0
    3          2 2016-04-05                     1                    NaN
    4          2 2016-04-20                     1                   15.0
    5          2 2016-04-29                     0                    9.0
    

    【讨论】:

    • 感谢您抽出宝贵时间回答。但是,我不是在寻找与该组中的前一行相关的差异,而是试图找出事件最后一次发生与当前日期的时间差。
    • 啊,我明白你的意思了,我会修改答案。
    • @SrikantChari 当前日期是什么时候?
    • @piRSquared 当前日期,我指的是“日期”列中的每个日期。例如,对于 group_ids = 1 和 dates = '2016-04-28',自上次事件发生后的天数 event_today_in_group = 1 为 27 天。
    猜你喜欢
    • 2021-02-15
    • 1970-01-01
    • 2015-08-04
    • 2017-10-26
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 2019-08-16
    • 2019-04-13
    相关资源
    最近更新 更多