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

我有一个具有这种整体结构的数据框:( 我知道。它可能会更好,但这是我必须使用的:)


| 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 中应用向前和向后填充,但我无法让我的代码工作......


Cats萌萌
浏览 206回答 1
1回答

三国纷争

DataFrame.groupby在列上使用patient_id并使用applytoffill和bfill: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_20            1    28-06-2020 13:05  27-06-2020 12:26               NaN               NaN1            1    28-06-2020 13:05               NaN               NaN               NaN2            1    28-06-2020 13:05               NaN  29-06-2020 14:00               NaN3            1    28-06-2020 13:05               NaN               NaN  29-06-2020 23:574            2    29-06-2020 18:26  29-06-2020 10:11               NaN               NaN5            2    29-06-2020 18:26               NaN               NaN               NaN6            2    29-06-2020 18:26               NaN  30-06-2020 19:36               NaN7            2    29-06-2020 18:26               NaN               NaN  31-06-2020 21:208            3    30-06-2020 09:06  29-06-2020 06:35               NaN               NaN9            3    30-06-2020 09:06  29-06-2020 07:28               NaN               NaN10           3    30-06-2020 09:06               NaN               NaN               NaN11           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 2342 ms ± 1.58 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)%%timeit -n10 @Method3297 ms ± 4.83 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python