Pandas中Oracle的Lead/Lag函数等价物
首先,我刚接触pandas,但我已经开始喜欢上它了。我想实现一个类似于Oracle中的Lag函数的功能。
假设你有这样一个数据表:
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函数,我可以很简单地使用这个函数:
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)
唯一的问题是,这样做并不能按某一列分组。即使我把日期和组这两列都设置为索引,我在滞后列中仍然会得到“5”。
有没有办法在pandas中实现类似于Lead和Lag函数的功能呢?
2 个回答
17
在pandas中,如果你想要进行“前移”操作,只需要用 shift(-1)
这个方法,而不是用1。
比如,你可以这样写:df['Data_lead'] = df.groupby(['Group'])['Data'].shift(-1)
。
106
你可以进行一个叫做 分组/应用(移动)操作:
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]
为了实现 按日期升序排列
的效果,你需要先对数据表进行排序:
df['Data_lagged'] = (df.sort_values(by=['Date'], ascending=True)
.groupby(['Group'])['Data'].shift(1))