如何在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
相关产品推荐
相关产品推荐

