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

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 关注
  • 202 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信