如何计算自上次事件==1 以来的天数?
Posted
技术标签:
【中文标题】如何计算自上次事件==1 以来的天数?【英文标题】:How to calculate the number of days since last event==1? 【发布时间】:2019-08-16 13:28:01 【问题描述】:我正在做一个分类问题,我试图预测汽车是否会在第二天加油。
数据包含日期、每辆汽车的 ID 以及指示汽车是否在该特定日期加油的虚拟变量。
我想要实现的是“days_since_refuelled”列。这应该计算为自上次出现 refueled==1 以来的天数,并且显然必须为每个 car_id 单独计算。如果之前没有 refuelled==1 的实例,则该值应等于 -1。
所需的输出应如下所示:
date car_id refuelled days_since_refuelled
01-01-2019 1 0 -1
01-01-2019 2 1 -1
01-01-2019 3 1 -1
06-01-2019 1 0 -1
06-01-2019 2 0 5
06-01-2019 3 0 5
09-01-2019 1 1 -1
09-01-2019 2 0 8
09-01-2019 3 0 8
14-01-2019 1 0 5
14-01-2019 2 1 13
14-01-2019 3 0 13
【问题讨论】:
您能否展示一下您对此问题的尝试或思路? 我正在寻找一个函数/循环来回答以下问题:“对于这个 car_id,它从加油到现在还有多少天?”。我希望这是有道理的。 【参考方案1】:将1
的行转换为NaN
s 通过Series.where
,然后Series.shift
和ffill
每组,然后用Series.sub
减去date
列,最后通过Series.dt.days
转换timedeltas 并替换Series.fillna
的缺失值:
#convert to datetimes
df['date'] = pd.to_datetime(df['date'], dayfirst=True)
df['days_since_refuelled'] = df['date'].where(df['refuelled'].eq(1))
df['days_since_refuelled'] = (df['date'].sub(df.groupby('car_id')['days_since_refuelled']
.apply(lambda x: x.shift().ffill())
)
.dt.days
.fillna(-1)
.astype(int))
print (df)
date car_id refuelled days_since_refulled days_since_refuelled
0 2009-01-01 1 0 -1 -1
1 2019-01-01 2 1 -1 -1
2 2019-01-01 3 1 -1 -1
3 2019-01-06 1 0 -1 -1
4 2019-01-06 2 0 5 5
5 2019-01-06 3 0 5 5
6 2019-01-09 1 1 -1 -1
7 2019-01-09 2 0 8 8
8 2019-01-09 3 0 8 8
9 2019-01-14 1 0 5 5
10 2019-01-14 2 1 13 13
11 2019-01-14 3 0 13 13
【讨论】:
以上是关于如何计算自上次事件==1 以来的天数?的主要内容,如果未能解决你的问题,请参考以下文章