Python中的SQLish窗口函数

Posted

技术标签:

【中文标题】Python中的SQLish窗口函数【英文标题】:SQLish window function in Python 【发布时间】:2019-08-20 15:51:01 【问题描述】:

我正在尝试在 Python 3.6 中执行类似 SQL 窗口函数的操作。我创建了以下代码,我发现 here,但我收到以下错误:

“ValueError:无法从重复的轴重新索引”

df = pd.DataFrame('id' : ['daeb21718d5a','daeb21718d5a','daeb21718d5a'],
           'product_id' : [123,456,789],
           'probability' : [0.076838,0.053384, 0.843900 ])

df['rank'] = df.sort_values(['probability'], ascending=False) \
               .groupby(['id']) \
               .cumcount() + 1

奇怪的是,如果我在分组之前添加.reset_index(drop=True),则错误已修复。

【问题讨论】:

What does `ValueError: cannot reindex from a duplicate axis` mean?的可能重复 您的预期输出是什么?您要对哪一列进行排名? 您使用的是什么版本的 Pandas?你的代码对我来说很好用(Pandas 0.24.2) 我无法重现您的错误,您的代码在我的机器上运行良好。 (pandas.__version__ 是 0.23.4) @MaxU 我用的是和你一样的版本。 【参考方案1】:

如果我对您的理解正确,您正在尝试根据id 的每组降序排列probability

你快到了,以下将解决你的问题:

df['rank'] = df.sort_values(['probability'], ascending=False) \
             .groupby(['id'])['probability'] \
             .cumcount() + 1

print(df)
             id  product_id  probability  rank
0  daeb21718d5a         123     0.076838     2
1  daeb21718d5a         456     0.053384     3
2  daeb21718d5a         789     0.843900     1

或者我们可以为此使用 pandas .rank 方法:

df['rank'] = df.groupby('id')['probability'].rank(ascending=False)

print(df)
             id  product_id  probability  rank
0  daeb21718d5a         123     0.076838   2.0
1  daeb21718d5a         456     0.053384   3.0
2  daeb21718d5a         789     0.843900   1.0

【讨论】:

以上是关于Python中的SQLish窗口函数的主要内容,如果未能解决你的问题,请参考以下文章

PANDAS 中类似 SQL 的窗口函数:Python Pandas Dataframe 中的行编号

利用Python进行数据分析(10)-移动窗口函数

SQL Server 中的窗口函数(2012 新函数)

在窗口动作odoo中调用Python函数

如何在python中应用窗口函数?

什么是 tsql 窗口函数中的“窗口描述符”