首先,我是大熊猫的新手,但我已经爱上了它。我试图在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函数?
答案 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)