第一行和当前行之间的差异(按组)

Ren*_*nan 3 pandas pandas-groupby

我有一个这样的数据集:

state,date,events_per_day
AM,2020-03-01,100
AM,2020-03-02,120
AM,2020-03-15,200
BA,2020-03-16,80
BA,2020-03-20,100
BA,2020-03-29,150
RS,2020-04-01,80
RS,2020-04-05,100
RS,2020-04-11,160
Run Code Online (Sandbox Code Playgroud)

现在我需要计算每组第一行中的日期与当前行中的日期之间的差异。即每组的第一行:

  • 对于“AM”组,第一个日期是 2020-03-01;
  • 对于“BA”组,第一个日期是 2020-03-16;
  • 对于“RS”组,时间为 2020 年 4 月 1 日。

最后我想要的结果是:

state,date,events_per_day,days_after_first_event
AM,2020-03-01,100,0
AM,2020-03-02,120,1    <--- 2020-03-02 - 2020-03-01
AM,2020-03-15,200,14   <--- 2020-03-14 - 2020-03-01
BA,2020-03-16,80,0     
BA,2020-03-20,100,4    <--- 2020-03-20 - 2020-03-16
BA,2020-03-29,150,13   <--- 2020-03-29 - 2020-03-16
RS,2020-04-01,80,0
RS,2020-04-05,100,4    <--- 2020-04-05 - 2020-04-01
RS,2020-04-11,160,10   <--- 2020-04-11 - 2020-04-01
Run Code Online (Sandbox Code Playgroud)

我发现如何使用 pandas 按组计算时间差?几乎就是我想要的。但是, diff() 返回连续行之间的差异,我需要当前行和第一行之间的差异。

我怎样才能做到这一点?

Ben*_*n.T 6

选项 3:groupby.transform

df['days_since_first'] = df['date'] - df.groupby('state')['date'].transform('first')
Run Code Online (Sandbox Code Playgroud)

输出

  state        date  events_per_day days_since_first
0    AM  2020-03-01             100           0 days
1    AM  2020-03-02             120           1 days
2    AM  2020-03-15             200          14 days
3    BA  2020-03-16              80           0 days
4    BA  2020-03-20             100           4 days
5    BA  2020-03-29             150          13 days
6    RS  2020-04-01              80           0 days
7    RS  2020-04-05             100           4 days
8    RS  2020-04-11             160          10 days
Run Code Online (Sandbox Code Playgroud)