【问题标题】:SQLish window function in PythonPython中的SQLish窗口函数
【发布时间】: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),则错误已修复。

【问题讨论】:

  • 您的预期输出是什么?您要对哪一列进行排名?
  • 您使用的是什么版本的 Pandas?你的代码对我来说很好用(Pandas 0.24.2)
  • 我无法重现您的错误,您的代码在我的机器上运行良好。 (pandas.__version__ 是 0.23.4)
  • @MaxU 我用的是和你一样的版本。

标签: python pandas


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 2021-12-04
    • 2018-08-10
    • 2022-01-19
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多