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]