偏移groupby相差一排

时间:2019-09-16 21:47:13

标签: python python-3.x pandas pandas-groupby

我有一个看起来像这样的数据框:

first   client   last_visit   theme_type   days_borrowed
----------------------------------------------------------
Y       A        4/23/2019    Candy        0
N       A        5/5/2019     Jewel        12               
N       A        5/8/2019     Chocolate    3         
N       A        6/2/2019     Candy        25
N       A        6/12/2019    Rock         10
Y       B        3/5/2019     Chocolate    0
N       B        3/5/2019     Rock         0
Y       C        2/6/2019     Rock         0
Y       D        1/30/2019    Jewel        0
N       D        2/4/2019     Rock         5
N       D        2/8/2019     Candy        4

days_borrowed列的计算公式为:

df['days_borrowed'] = df.groupby('client')['last_visit'].diff().dt.days.fillna(0)

但是,如果需要这样做的话,我需要它实际上求差,因为借用的#天实际上是针对先前主题而不是当前主题。选择的最后一个主题应计算为last_visit和一个静态日期(例如7/31/2019)之差。

因此,所需的输出如下所示:

first   client   last_visit   theme_type   days_borrowed
----------------------------------------------------------
Y       A        4/23/2019    Candy        12
N       A        5/5/2019     Jewel        3              
N       A        5/8/2019     Chocolate    25         
N       A        6/2/2019     Candy        10
N       A        6/12/2019    Rock         49
Y       B        3/5/2019     Chocolate    0
N       B        3/5/2019     Rock         148
Y       C        2/6/2019     Rock         175
Y       D        1/30/2019    Jewel        5
N       D        2/4/2019     Rock         4
N       D        2/8/2019     Candy        173

其中49、148、175和173是通过计算与last_visit和固定日期7/31/2019的差值而得出的。

所以我想知道是否有可能:

1)将差值计算偏移1,然后

2)对于每个客户的最后一次出现,是否要使用last_visit和固定日期(7/31/2019)之间的差额?

任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:1)

  1. diff-1参数使用periods,然后取绝对值。
  2. fillna和您想要的计算。

代码:

import pandas as pd
#df['last_visit'] = pd.to_datetime(df.last_visit)

df['days_borrowed'] = (df.groupby('client')['last_visit']
                         .diff(-1).dt.days.abs()
                         .fillna((pd.to_datetime('2019-07-31')-df['last_visit']).dt.days))

输出:df

   first client last_visit theme_type  days_borrowed
0      Y      A 2019-04-23      Candy           12.0
1      N      A 2019-05-05      Jewel            3.0
2      N      A 2019-05-08  Chocolate           25.0
3      N      A 2019-06-02      Candy           10.0
4      N      A 2019-06-12       Rock           49.0
5      Y      B 2019-03-05  Chocolate            0.0
6      N      B 2019-03-05       Rock          148.0
7      Y      C 2019-02-06       Rock          175.0
8      Y      D 2019-01-30      Jewel            5.0
9      N      D 2019-02-04       Rock            4.0
10     N      D 2019-02-08      Candy          173.0