python - 如何计算自上次事件==1 以来的天数?
问题描述
我正在做一个分类问题,我试图预测汽车是否会在第二天加油。
数据包括日期、每辆汽车的 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
解决方案
将行转换1
为NaN
s by Series.where
,然后Series.shift
每组转换ffill
,然后减去date
列 by Series.sub
,最后转换 timedeltasSeries.dt.days
并用 替换缺失值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
推荐阅读
- c# - Entity Framework 6 - 处理二进制数据时的内存和性能问题(异步方法)
- c# - 没有来自 'System.Collections.Generic.List 的隐式引用转换
' 到 'MediatR.IRequest ' + .NET 核心 + CQRS - python - Python 将文本添加到使用 to_html() 方法生成的 HTML 表格文件文件中
- bittorrent - 如何从 .torrent 文件中获取碎片值
- c# - c# Linq 方法不符合我设置的条件之一
- pandas - 从 Pandas 数据框列中包含的列表中提取字典值
- python - pytorch 将模型移动到 gpu 导致运行时错误('self' 作为 cpu 设备类型)
- java - 斯巴达克斯中的 SmartEdit 设置
- c# - 用 LINQ 合并两个 IEnumerable
- .net - Azure Pipelines - VS 测试任务在提供筛选条件时失败