当前位置: 首页 > 面试题库 >

相当于Oracle Lead / Lag函数的Pandas

商骞仕
2023-03-14
问题内容

首先,我是熊猫的新手,但我已经爱上了它。我正在尝试实现与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

如果这是一个oracle数据库,而我想创建一个按“ Group”列分组并按Date排序的滞后函数,则可以轻松使用此函数:

 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

在大熊猫中,我可以将日期设置为索引并使用shift方法:

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

唯一的问题是,这不会按列分组。即使将日期和组这两列设置为索引,我仍然会在滞后列中获得“ 5”。

有没有办法在熊猫中实现等效的超前和滞后功能?


问题答案:

您可以执行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]

为了获得ORDER BY Date ASC效果,您必须首先对DataFrame进行排序

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


 类似资料:
  • 问题内容: 我正在将PHP代码迁移到Google App Engine-Java。 因此,我需要使用Java中的PHP的crypt函数, 因为我已经 使用crypt 将注册用户的所有密码存储在数据库中。 编辑1 :这是我的php密码加密代码: $ password =“ test123”; $ pwd = crypt($ password,$ password); 回声$ pwd; 输出为(在 W

  • 问题内容: 我正在尝试将查询从MySQL移植到SQL SERVER2012。 如何为MySQL的substring_index()编写等效项? MySQL SUBSTRING_INDEX()从给定字符串中返回指定次数的分隔符之前的子字符串。 SUBSTRING_INDEX(str,delim,count) 输出: 问题答案: 尝试基于T-SQL和XQuery()的以下解决方案: T-SQL标量函数

  • 问题内容: 在python中,如果我有一些要基于输入调用的函数,则可以执行以下操作: 那就是我有一个映射到函数的函数名字典,并通过字典查找来调用函数。 如何在Java中执行此操作? 问题答案: 有几种方法可以解决此问题。其中大多数已发布: 命令 -在地图中保留一堆具有execute()或invoke()方法的对象;通过名称查找命令,然后调用方法。 多态性 -比命令更一般的说,您可以在任何相关对象集

  • 问题内容: 我有一个特定的问题。我有一个包含无效值的表。我需要用大于的先前值替换无效值(此处)。 困难在于,使用Update或insert(游标和update可以做到)对我来说是不合适的。我唯一的方法是使用Select语句。 当我将-函数与when一起使用时,我只会得到一列具有正确值的列。 内容: 预期查询结果: 问题答案: 结果 :

  • 问题内容: 我想知道Scala或其著名的数学库之一(例如Spire)是否具有与Go 函数相同的功能 (来自http://tour.golang.org/#4) 如果没有,那么获得相同功能的最“ Scala”方法是什么? 问题答案: 它是Java 库的一部分:

  • 问题内容: 具有向量化if / else的语义(类似于Apache Spark的/ DataFrame方法)。我知道我可以在pandas上使用,但通常会定义自己的API来代替原始函数使用,通常使用/更为方便。 果然,我发现了。但是,乍一看,它具有完全不同的语义。我找不到一种方法来重写使用pandas的最基本的示例: 我是否缺少明显的东西?还是将熊猫命名为一个完全不同的用例,尽管名称与相同? 问题答