Python 如何计算自上次事件==1起的天数?

Python 如何计算自上次事件==1起的天数?,python,pandas,loops,Python,Pandas,Loops,我正在做一个分类问题,我试图预测一辆汽车是否会在第二天加油 数据由日期、每辆车的ID和一个虚拟变量组成,该变量指示该车是否在该特定日期加油 我想实现的是“加油后的日子”专栏。这应计算为自上次加油==1起的天数,显然,必须针对每辆车单独计算。如果之前没有加油==1的实例,则该值应等于-1 所需的输出应如下所示: date car_id refuelled days_since_refuelled 01-01-2019 1 0 -1 01-01-2019

我正在做一个分类问题,我试图预测一辆汽车是否会在第二天加油

数据由日期、每辆车的ID和一个虚拟变量组成,该变量指示该车是否在该特定日期加油

我想实现的是“加油后的日子”专栏。这应计算为自上次加油==1起的天数,显然,必须针对每辆车单独计算。如果之前没有加油==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

1
的行转换为
NaN
s by,然后每组转换为
ffill
,然后减去
date
列by,最后一次转换timedelta by,并将缺少的值替换为:


你能展示一下你对此问题的尝试或想法吗?我正在寻找一个函数/循环来回答这个问题:“对于这辆车,它加油多少天了?”。我希望这是有道理的。
#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