You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Polars中更高效地实现按行排名(类似pandas的df.rank(axis=1))

如何在Polars中更高效地实现按行排名(类似pandas的df.rank(axis=1))

嘿,我来帮你搞定这个Polars按行排名的效率问题!你提到想要实现类似pandas里df.rank(axis=1)的行级排名功能,之前的写法虽然能得到正确结果,但步骤确实有点繁琐,其实Polars已经有更直接、高效的原生方法啦。

首先先明确我们的输入数据(先还原成Polars DataFrame的构建方式):

import polars as pl

data = {
    0: [0, 1, 0, 1, 1, 0, 1, 0, 1, 1],
    1: [0, 0, 0, 0, 0, 0, 1, 0, 1, 1],
    2: [0, 0, 1, 0, 1, 0, 1, 0, 0, 1],
    3: [0, 1, 0, 0, 1, 0, 0, 0, 1, 0],
    4: [0, 1, 1, 0, 1, 0, 0, 0, 1, 1]
}

df2 = pl.DataFrame(data)

对应的输入DataFrame为:

0  1  2  3  4
0  0  0  0  0  0
1  1  0  0  1  1
2  0  0  1  0  1
3  1  0  0  0  0
4  1  0  1  1  1
5  0  0  0  0  0
6  1  1  1  0  0
7  0  0  0  0  0
8  1  1  0  1  1
9  1  1  1  0  1

在pandas里我们只需要一行代码就能实现行级排名:

df.rank(axis=1)

而你之前用的Polars写法步骤较多,其实现在Polars已经支持直接指定axis=1的rank方法,这是原生的高效实现,比拼接数组再展开的方式快得多,代码也更简洁:

df2.rank(axis=1)

运行这段代码就能得到和你之前完全一致的输出:

0    1    2    3    4
0  3.0  3.0  3.0  3.0  3.0
1  4.0  1.5  1.5  4.0  4.0
2  2.0  2.0  4.5  2.0  4.5
3  5.0  2.5  2.5  2.5  2.5
4  3.5  1.0  3.5  3.5  3.5
5  3.0  3.0  3.0  3.0  3.0
6  4.0  4.0  4.0  1.5  1.5
7  3.0  3.0  3.0  3.0  3.0
8  3.5  3.5  1.0  3.5  3.5
9  3.5  3.5  3.5  1.0  3.5

如果需要调整排名的计算方式(比如使用min、max、first等方法),还可以通过method参数指定,比如:

# 使用最小排名方式
df2.rank(axis=1, method="min")

这种原生方法的优势在于:

  • 代码简洁直观,和pandas的写法逻辑一致,容易理解
  • 是Polars内部优化的实现,性能远优于手动拼接数组、explode再pivot的操作,尤其是处理大数据集时差距会更明显

备注:内容来源于stack exchange,提问作者rhug123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 18:13:05