【问题标题】:Pandas equivalent of Oracle Lead/Lag functionPandas 等效于 Oracle Lead/Lag 函数
【发布时间】:2021-10-31 20:03:56
【问题描述】:

首先我是 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 数据库,我想创建一个按“组”列分组并按日期排序的滞后函数,我可以轻松使用此函数:

 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 函数?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你可以执行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))
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 重复 4 年前接受的答案
      • 我的错 - 你说的是 -1 而不是 1。不幸的是,由于它已被锁定,因此我无法撤消反对票。如果您对答案进行任何更改,我可以撤销我的投票
      • 我已编辑,请更新@WestCoastProjects
      猜你喜欢
      • 1970-01-01
      • 2016-01-21
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多