根据连续性创建 pandas 数据框的子集

Create subset of pandas dataframe based on continuity

我有一个 Pandas 数据框,其时间序列索引大约有 300 万行。该数据框有多个列,我想根据列中的值根据时间序列的连续性从该数据框中创建子集。数据不会在所有列上继续。通过这个,我的意思是在任何 n 列中都有 NaN 的行,在这种情况下,这意味着它不是一个连续的时间序列。我想从原始数据框 (A) 构建子集 (B,C),这些子集应该是一个连续的时间序列,两列中都没有 NaN 值。

示例:

数据帧A

predicted_at x1 x2
2021-08-21 11:00:00 UTC 1002 202
2021-08-21 12:00:00 UTC 123 432
2021-08-21 13:00:00 UTC 1253 542
2021-08-21 14:00:00 UTC 231 NaN
2021-08-21 15:00:00 UTC 23 232
2021-08-21 16:00:00 UTC 321 123
2021-08-21 17:00:00 UTC 125 124

子集 B:

predicted_at x1 x2
2021-08-21 11:00:00 UTC 1002 202
2021-08-21 12:00:00 UTC 123 432
2021-08-21 13:00:00 UTC 1253 542

子集 C:

predicted_at x1 x2
2021-08-21 15:00:00 UTC 23 232
2021-08-21 16:00:00 UTC 321 123
2021-08-21 17:00:00 UTC 125 124

如何进行此操作?

使用cumsum设置连续组:

df['subset'] = df.isna().any(axis=1).cumsum().loc[df.notna().all(axis=1)]
print(df)

# Output:
              predicted_at    x1     x2  subset
0  2021-08-21 11:00:00 UTC  1002  202.0     0.0
1  2021-08-21 12:00:00 UTC   123  432.0     0.0
2  2021-08-21 13:00:00 UTC  1253  542.0     0.0
3  2021-08-21 14:00:00 UTC   231    NaN     NaN
4  2021-08-21 15:00:00 UTC    23  232.0     1.0
5  2021-08-21 16:00:00 UTC   321  123.0     1.0
6  2021-08-21 17:00:00 UTC   125  124.0     1.0

现在您可以做 groupby 或您想做的事了。