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:删除作为另一列值的子字符串,并从给定列的值中包含正则表达式字符

识别 pyspark 中第一次出现的列值,然后根据它增加另一列

根据另一列的字段值选择具有相同列值的行

如何根据另一列值将一列分成多个?

添加具有另一列值的 len() 的 DataFrame 列