Создайте подмножество фрейма данных pandas на основе непрерывности

#python #pandas #dataframe #time-series

Вопрос:

У меня есть фрейм данных Pandas с индексом временных рядов около 3 миллионов строк. Этот фрейм данных содержит несколько столбцов, и я хотел бы создать подмножества из этого фрейма данных, зависящие от непрерывности времени, на основе значений в столбцах. Данные сохраняются не по всем столбцам. Под этим я подразумеваю, что в любом из n столбцов есть строки с NaN, и в данном случае это означает, что это не непрерывная временная серия. Я хочу построить подмножества (B,C) из исходного кадра данных (A), и эти подмножества должны быть непрерывными временными рядами без значений NaN в любом столбце.

Пример:

Фрейм данных A

предсказано_ат 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:

предсказано_ат 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:

предсказано_ат 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

Как бы вы поступили для этого?

Комментарии:

1. Почему в вашем примере подмножества B и C одинаковы?

2. @RJAdriaansen отредактировано

3. Что вы хотите сделать с этими подмножествами? Каким должен быть результат?

Ответ №1:

Используется 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 или то, что хотите.