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窗口函数的主要内容,如果未能解决你的问题,请参考以下文章