PySpark - 根据另一列值的降序添加递增的整数排名值
Posted
技术标签:
【中文标题】PySpark - 根据另一列值的降序添加递增的整数排名值【英文标题】:PySpark - Add incrementing integer rank value based on descending order from another column value 【发布时间】:2021-10-21 15:24:52 【问题描述】:我有一个 pyspark 数据框,如下所示:
id | score |
---|---|
1 | 0.5 |
1 | 2.5 |
2 | 4.45 |
3 | 8.5 |
3 | 3.25 |
3 | 5.55 |
我想根据score
列的值以递增顺序创建一个新列rank
,这意味着最高值将具有0
的排名,并通过id
列重新开始计数。
类似这样的:
id | value | rank |
---|---|---|
1 | 2.5 | 0 |
1 | 0.5 | 1 |
2 | 4.45 | 0 |
3 | 8.5 | 0 |
3 | 5.55 | 1 |
3 | 3.25 | 2 |
提前致谢!
【问题讨论】:
【参考方案1】:您可以使用pyspark.sql.functions.dense_rank
,它返回窗口分区内的行排名。
请注意,要使其正常工作,我们必须添加一个orderBy
,因为dense_rank()
需要订购窗口。最后让我们在结果上减去 -1(默认从 1 开始)
from pyspark.sql.functions import *
df = df.withColumn(
"rank", dense_rank().over(Window.partitionBy("id").orderBy(desc("score"))) - 1)
>>> df.show()
+---+-----+----+
| id|score|rank|
+---+-----+----+
| 1| 2.5| 0|
| 1| 0.5| 1|
| 2| 4.45| 0|
| 3| 8.5| 0|
| 3| 5.55| 1|
| 3| 3.25| 2|
+---+-----+----+
SQL
语法:
SELECT dense_rank()(value_expr) OVER (PARTITION BY window_partition ORDER BY window_ordering) from table
【讨论】:
以上是关于PySpark - 根据另一列值的降序添加递增的整数排名值的主要内容,如果未能解决你的问题,请参考以下文章
PySpark DataFrame 根据另一列中时间戳值的最小/最大条件更新列值
pyspark:删除作为另一列值的子字符串,并从给定列的值中包含正则表达式字符