亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 94 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號