在pandas数据框中查找自上一个事件以来的天数。

6

我是一个pandas数据框:

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
1个回答

8

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

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

谢谢您抽出时间回答。然而,我不是在寻找与组中上一行的差异,而是试图找到事件上次发生和当前日期之间的时间差。 - Srikant Chari
啊,我明白你的意思了,我会修改答案。 - cmaher
@SrikantChari 现在是什么日期? - piRSquared
@piRSquared 所谓的“当前日期”,是指在“dates”列中的每个日期。例如,对于group_ids = 1和dates ='2016-04-28',事件event_today_in_group=1自上次发生以来的天数为27天。 - Srikant Chari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接