Pandas相当于Oracle Lead / Lag功能

时间:2014-05-14 20:51:34

标签: python pandas

首先,我是大熊猫的新手,但我已经爱上了它。我试图在Oracle中实现等效的Lag函数。

假设你有这个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

如果这是一个oracle数据库,我想创建一个由" Group"组成的滞后函数。列并按日期排序我可以轻松使用此功能:

 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中我可以将日期设置为索引并使用shift方法:

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

唯一的问题是,这不是按列分组的。即使我将两列Date和Group设置为索引,我仍然会得到" 5"在滞后栏中。

有没有办法在Pandas中实现等效的Lead和lag函数?

2 个答案:

答案 0 :(得分:47)

您可以执行groupby/apply (shift) operation

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]

要获得ORDER BY Date ASC效果,您必须先对DataFrame进行排序:

df['Data_lagged'] = (df.sort_values(by=['Date'], ascending=True)
                       .groupby(['Group'])['Data'].shift(1))

答案 1 :(得分:1)

对于pandas中的lead操作,只需要使用shift(-1)而不是1

df['Data_lead'] = df.groupby(['Group'])['Data'].shift(-1)