Pandas 的 [df.groupby(...)['col_name'].shift(1)] 的 SQL 等效项
Posted
技术标签:
【中文标题】Pandas 的 [df.groupby(...)[\'col_name\'].shift(1)] 的 SQL 等效项【英文标题】:SQL equivalent for Pandas's [df.groupby(...)['col_name'].shift(1)]Pandas 的 [df.groupby(...)['col_name'].shift(1)] 的 SQL 等效项 【发布时间】:2018-10-31 00:10:54 【问题描述】:我有这段代码,我想把它写成 SQL。有谁知道等效的 SQL 代码是什么样的?
lags = range(1, 5)
df = df.assign(**
''.format('lag', t): df.groupby('article_id').num_views.shift(t) for t in lags
)
更新:
我正在寻找 SQL 标准方言。 这是一个数据集示例(部分前 10 行):
article_id section time num_views comments
0 abc111b A 00:00 15 0
1 abc111b A 01:00 36 0
2 abc111b A 02:00 36 0
3 bbbddd222hf A 03:00 41 0
4 bbbddd222hf B 04:00 44 0
5 nnn678www B 05:00 39 0
6 nnn678www B 06:00 38 0
7 nnn678www B 07:00 66 0
8 nnn678www C 08:00 65 0
9 nnn678www C 09:00 87 1
【问题讨论】:
请提供一个小的可重复样本数据集。另请说明您询问的是哪种 SQL 方言... 我更新了我的问题。 【参考方案1】:可以使用LAG() function,属于SQL-99 ANSI标准"windowing functions"
:
select
article_id, section, time, num_views, comments,
lag(num_views, 1, 0) over(partition by article_id order by article_id, time) as lag1,
lag(num_views, 2, 0) over(partition by article_id order by article_id, time) as lag2,
lag(num_views, 3, 0) over(partition by article_id order by article_id, time) as lag3,
lag(num_views, 4, 0) over(partition by article_id order by article_id, time) as lag4
from tab;
Complete and working SQLFiddle example...
PSplease be aware that not all RDBMS systems implement "windowing functions"
【讨论】:
写不出这么快,很好:) @MaxU 太好了,谢谢!只是一个小问题 - 如果我想创建 50 个滞后,我该如何循环执行,这样我就不必为每个滞后重复相同的代码? @user8436761,只需使用任何编程语言(例如 Python)动态生成 SQL。以上是关于Pandas 的 [df.groupby(...)['col_name'].shift(1)] 的 SQL 等效项的主要内容,如果未能解决你的问题,请参考以下文章
df.groupby('id').resample('D').last() 在 Pandas 中的 Pyspark 等效项
python pandas, DF.groupby().agg(), agg() 中的列引用
python – Pandas使用groupby中的count来创建新列