根据连续性创建 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
或您想做的事了。
我有一个 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
或您想做的事了。