Выберите последнюю строку из каждого столбца мультииндекса Pandas DataFrame в зависимости от времени, когда столбцы имеют разную длину - PullRequest
0 голосов
/ 31 января 2020

У меня есть следующий Pandas мультииндексный DataFrame с индексом верхнего уровня, являющимся идентификатором группы, и индексом второго уровня, являющимся when, в формате времени ISO 8601 (показан здесь без времени):

                                     value      weight
                         when                     
5e33c4bb4265514aab106a1a 2011-05-12   1.34       0.79
                         2011-05-07   1.22       0.83
                         2011-05-03   2.94       0.25
                         2011-04-28   1.78       0.89
                         2011-04-22   1.35       0.92
...                                    ...        ...
5e33c514392b77d517961f06 2009-01-31  30.75       0.12
                         2009-01-24  30.50       0.21
                         2009-01-23  29.50       0.96
                         2009-01-10  28.50       0.98
                         2008-12-08  28.50       0.65

when в настоящее время определяется как index, но это не является обязательным требованием.

Утверждения

  1. when могут быть неуникальными.
  2. Столбцы могут быть разной длины в группах
  3. Внутри групп when, value и weight всегда будут одинаковой длины (для каждого when всегда будет value и weight

Вопрос

Используя параметр index_time, как вы получите:

  1. Самое последнее прошлое value и weight от каждой группы относительно index_time вместе с разницей (в секундах) между index_time и when.
  2. index_time может быть временем в прошлом, так что только записи, где when <= <code>index_time.
  3. Результат должен быть каким-то образом проиндексирован, чтобы идентификатор группы каждого результата был n следует вывести

Пример

Из приведенного выше, если index_time было 2011-05-10, то результат должен быть:

                          value     weight      age                     
5e33c4bb4265514aab106a1a   1.22      0.83      259200
5e33c514392b77d517961f06  30.75      0.12    72576000

1 Ответ

0 голосов
/ 01 февраля 2020

Где оригинал DataFrame, указанный в вопросе df:

import pandas as pd

df.sort_index(inplace=True)
result = df.loc[pd.IndexSlice[:, :when], :].groupby('id').tail(1)
result['age'] =  when - result.index.get_level_values(level=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...