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

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

Pandas - 按索引向前和向后填充

Pandas - 按索引向前和向后填充

Cats萌萌 2023-04-18 11:06:46
我有一個具有這種整體結構的數據框:( 我知道。它可能會更好,但這是我必須使用的:)| patient_id | inclusion_timestamp | pre_event_1      | post_event_1     | post_event_2     ||------------|---------------------|------------------|------------------|------------------|| 1          | NaN                 | 27-06-2020 12:26 | NaN              | NaN              || 1          | 28-06-2020 13:05    | NaN              | NaN              | NaN              || 1          | NaN                 | NaN              | 29-06-2020 14:00 | NaN              || 1          | NaN                 | NaN              | NaN              | 29-06-2020 23:57 || 2          | NaN                 | 29-06-2020 10:11 | NaN              | NaN              || 2          | 29-06-2020 18:26    | NaN              | NaN              | NaN              || 2          | NaN                 | NaN              | 30-06-2020 19:36 | NaN              || 2          | NaN                 | NaN              | NaN              | 31-06-2020 21:20 || 3          | NaN                 | 29-06-2020 06:35 | NaN              | NaN              || 3          | NaN                 | 29-06-2020 07:28 | NaN              | NaN              || 3          | 30-06-2020 09:06    | NaN              | NaN              | NaN              || 3          | NaN                 | NaN              | NaN              | 01-07-2020 12:10 |等等。我知從 inclusion_timestamp 進行計算的唯一方法是從 inclusion_timestamp 向前填充。但是,這會導致 pre_event_1 字段的計算錯誤,因為它的列通常在計算值之前。我認為答案是遍歷索引列,然后在每個 patient_id 中應用向前和向后填充,但我無法讓我的代碼工作......
查看完整描述

1 回答

?
三國紛爭

TA貢獻1804條經驗 獲得超7個贊

DataFrame.groupby在列上使用patient_id并使用applytoffillbfill

df['inclusion_timestamp']?=?df.groupby('patient_id')['inclusion_timestamp']\
??????????????????????????????.apply(lambda?x:?x.ffill().bfill())

DataFrame.groupby或者使用with的另一個想法Series.combine_first

g?=?df.groupby('patient_id')['inclusion_timestamp']
df['inclusion_timestamp']?=?g.ffill().combine_first(g.bfill())

使用兩個連續的另一個想法Series.groupby

df['inclusion_timestamp']?=?df['inclusion_timestamp'].groupby(df['patient_id'])\
???????????????????????????.ffill().groupby(df['patient_id']).bfill()

結果:

? ? patient_id inclusion_timestamp? ? ? ?pre_event_1? ? ? post_event_1? ? ? post_event_2

0? ? ? ? ? ? 1? ? 28-06-2020 13:05? 27-06-2020 12:26? ? ? ? ? ? ? ?NaN? ? ? ? ? ? ? ?NaN

1? ? ? ? ? ? 1? ? 28-06-2020 13:05? ? ? ? ? ? ? ?NaN? ? ? ? ? ? ? ?NaN? ? ? ? ? ? ? ?NaN

2? ? ? ? ? ? 1? ? 28-06-2020 13:05? ? ? ? ? ? ? ?NaN? 29-06-2020 14:00? ? ? ? ? ? ? ?NaN

3? ? ? ? ? ? 1? ? 28-06-2020 13:05? ? ? ? ? ? ? ?NaN? ? ? ? ? ? ? ?NaN? 29-06-2020 23:57

4? ? ? ? ? ? 2? ? 29-06-2020 18:26? 29-06-2020 10:11? ? ? ? ? ? ? ?NaN? ? ? ? ? ? ? ?NaN

5? ? ? ? ? ? 2? ? 29-06-2020 18:26? ? ? ? ? ? ? ?NaN? ? ? ? ? ? ? ?NaN? ? ? ? ? ? ? ?NaN

6? ? ? ? ? ? 2? ? 29-06-2020 18:26? ? ? ? ? ? ? ?NaN? 30-06-2020 19:36? ? ? ? ? ? ? ?NaN

7? ? ? ? ? ? 2? ? 29-06-2020 18:26? ? ? ? ? ? ? ?NaN? ? ? ? ? ? ? ?NaN? 31-06-2020 21:20

8? ? ? ? ? ? 3? ? 30-06-2020 09:06? 29-06-2020 06:35? ? ? ? ? ? ? ?NaN? ? ? ? ? ? ? ?NaN

9? ? ? ? ? ? 3? ? 30-06-2020 09:06? 29-06-2020 07:28? ? ? ? ? ? ? ?NaN? ? ? ? ? ? ? ?NaN

10? ? ? ? ? ?3? ? 30-06-2020 09:06? ? ? ? ? ? ? ?NaN? ? ? ? ? ? ? ?NaN? ? ? ? ? ? ? ?NaN

11? ? ? ? ? ?3? ? 30-06-2020 09:06? ? ? ? ? ? ? ?NaN? ? ? ? ? ? ? ?NaN? 01-07-2020 12:10

性能(使用 測量timeit):


df.shape

(1200000, 5)


%%timeit -n10 @Method 1 (Best Method)

263 ms ± 1.72 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)


%%timeit -n10 @Method 2

342 ms ± 1.58 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)


%%timeit -n10 @Method3

297 ms ± 4.83 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)


查看完整回答
反對 回復 2023-04-18
  • 1 回答
  • 0 關注
  • 243 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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