为了账号安全,请及时绑定邮箱和手机立即绑定

Python:对于每一行,获取值> 0的下一个较早日期

Python:对于每一行,获取值> 0的下一个较早日期

Cats萌萌 2022-12-20 11:30:44
尝试获取值 > 0 的当前或过去日期。将使用它来计算自值 > 0 以来的天数。如果日期具有值,则它将为 0 天。示例数据和所需结果如下所示。数据是“日期”和“值”列,结果是最后两列。date        value   'date value > 0'    'days since value > 0'2020-04-30  0       2020-04-28           22020-04-29  0       2020-04-28           12020-04-28  1       2020-04-28           0 2020-03-31  6       2020-03-31           02020-03-30  1       2020-03-30           02020-03-29  3       2020-03-29           02020-02-29  0       2020-01-29           312020-01-31  0       2020-01-29           22020-01-30  0       2020-01-29           12020-01-29  1       2020-01-29           0数据格式可以是字典或数据框。我正在从 csv 导入并将导出回 csv。逻辑:对于每一行,过滤到仅日期 <= 当前行日期的记录,然后获取值 > 0 的过滤数据框的最大日期。最大日期是“日期值 > 0”。编辑:我一直在尝试按顺序迭代数据帧记录,例如pandas df.shift(), df.rolling(),df.iloc但坚持如何“回顾”以获取值 > 0 的先前记录的日期。
查看完整描述

1 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

假设您有一个类型data为“日期”列和datetime64类型为“值”列的数据框int64:


>>> data

        date  value

0 2020-04-30      0

1 2020-04-29      0

2 2020-04-28      1

3 2020-03-31      6

4 2020-03-30      1

5 2020-03-29      3

6 2020-02-29      0

7 2020-01-31      0

8 2020-01-30      0

9 2020-01-29      1

>>> data.dtypes

date     datetime64[ns]

value             int64

dtype: object

然后你可以按日期的升序对数据帧进行排序,然后创建一个新列“prevdate”来复制“date”列但设置为NaT值为 0 的行,如下所示:


data['prevdate'] = data['date'].where(data['value'].ne(0))

然后向前填充NaT值:


>>> data.sort_values('date', inplace=True)

>>> data['prevdate'] = data['date'].where(data['value'].ne(0)).fillna(method='ffill')

>>> data

        date  value   prevdate

9 2020-01-29      1 2020-01-29

8 2020-01-30      0 2020-01-29

7 2020-01-31      0 2020-01-29

6 2020-02-29      0 2020-01-29

5 2020-03-29      3 2020-03-29

4 2020-03-30      1 2020-03-30

3 2020-03-31      6 2020-03-31

2 2020-04-28      1 2020-04-28

1 2020-04-29      0 2020-04-28

0 2020-04-30      0 2020-04-28

现在您可以简单地在两个日期列之间进行减法并将差值转换为整数:


>>> data['days'] = (data['date'] - data['prevdate']).apply(lambda x: x.days)

>>> data

        date  value   prevdate  days

9 2020-01-29      1 2020-01-29     0

8 2020-01-30      0 2020-01-29     1

7 2020-01-31      0 2020-01-29     2

6 2020-02-29      0 2020-01-29    31

5 2020-03-29      3 2020-03-29     0

4 2020-03-30      1 2020-03-30     0

3 2020-03-31      6 2020-03-31     0

2 2020-04-28      1 2020-04-28     0

1 2020-04-29      0 2020-04-28     1

0 2020-04-30      0 2020-04-28     2


查看完整回答
反对 回复 2022-12-20
  • 1 回答
  • 0 关注
  • 77 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号