Pandas эквивалент функции Oracle Lead/Lag

Сначала я новичок в pandas, но я уже влюбился в него. Я пытаюсь реализовать эквивалент функции Lag от Oracle.

Предположим, что у вас есть этот DataFrame:

Date                   Group      Data
2014-05-14 09:10:00        A         1
2014-05-14 09:20:00        A         2
2014-05-14 09:30:00        A         3
2014-05-14 09:40:00        A         4
2014-05-14 09:50:00        A         5
2014-05-14 10:00:00        B         1
2014-05-14 10:10:00        B         2
2014-05-14 10:20:00        B         3
2014-05-14 10:30:00        B         4

Если это была база данных оракула, и я хотел создать функцию задержки, сгруппированную по столбцу "Группа" и упорядоченную по дате, я мог бы легко использовать эту функцию:

 LAG(Data,1,NULL) OVER (PARTITION BY Group ORDER BY Date ASC) AS Data_lagged

Это приведет к следующей таблице:

Date                   Group     Data    Data lagged
2014-05-14 09:10:00        A        1           Null
2014-05-14 09:20:00        A        2            1
2014-05-14 09:30:00        A        3            2
2014-05-14 09:40:00        A        4            3
2014-05-14 09:50:00        A        5            4
2014-05-14 10:00:00        B        1           Null
2014-05-14 10:10:00        B        2            1
2014-05-14 10:20:00        B        3            2
2014-05-14 10:30:00        B        4            3

В pandas я могу установить дату как индекс и использовать метод сдвига:

db["Data_lagged"] = db.Data.shift(1)

Единственная проблема заключается в том, что это не группируется по столбцу. Даже если я установил два столбца Date и Group в качестве индексов, я бы все равно получил "5" в столбце с задержкой.

Есть ли способ реализовать эквивалент функций Lead и lag в Pandas?

Ответы

Ответ 1

Вы можете выполнить операцию groupby/apply (shift):

In [15]: df['Data_lagged'] = df.groupby(['Group'])['Data'].shift(1)

In [16]: df
Out[16]: 
                Date Group  Data  Data_lagged
2014-05-14  09:10:00     A     1          NaN
2014-05-14  09:20:00     A     2            1
2014-05-14  09:30:00     A     3            2
2014-05-14  09:40:00     A     4            3
2014-05-14  09:50:00     A     5            4
2014-05-14  10:00:00     B     1          NaN
2014-05-14  10:10:00     B     2            1
2014-05-14  10:20:00     B     3            2
2014-05-14  10:30:00     B     4            3

[9 rows x 4 columns]