我有一个看起来像这样的数据框:
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)之间的差额?
任何帮助将不胜感激!谢谢!
答案 0 :(得分:1)
diff
的-1
参数使用periods
,然后取绝对值。 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