如何根据列中的一组行对数据框进行排名?

Posted

技术标签:

【中文标题】如何根据列中的一组行对数据框进行排名?【英文标题】:How to rank dataframe depending on a group of rows in a column? 【发布时间】:2021-01-15 16:47:43 【问题描述】:

我有这个数据框:

+-----+----------+---------+
|num  |Timestamp |frequency|
+-----+----------+---------+
|20.0 |1632899456|4        |
|20.0 |1632901256|4        |
|20.0 |1632901796|4        |
|20.0 |1632899155|4        |
|10.0 |1632901743|2        |
|10.0 |1632899933|2        |
|91.0 |1632899756|1        |
|32.0 |1632900776|1        |
|41.0 |1632900176|1        |
+-----+----------+---------+

我想添加一个包含每个频率排名的列。新的数据框是这样的:

+-----+----------+---------+------------+
|num  |Timestamp |frequency|rank        |
+-----+----------+---------+------------+
|20.0 |1632899456|4        |1           |
|20.0 |1632901256|4        |1           | 
|20.0 |1632901796|4        |1           |
|20.0 |1632899155|4        |1           |
|10.0 |1632901743|2        |2           |
|10.0 |1632899933|2        |2           |
|91.0 |1632899756|1        |3           |
|32.0 |1632900776|1        |3           |
|41.0 |1632900176|1        |3           |
+-----+----------+---------+------------+

我使用的是 Spark 版本 2.4.3 和 SQLContext,以及 scala 语言。

【问题讨论】:

【参考方案1】:

你可以使用dense_rank:

import org.apache.spark.sql.expressions.Window

val df2 = df.withColumn("rank", dense_rank().over(Window.orderBy(desc("frequency")))

【讨论】:

以上是关于如何根据列中的一组行对数据框进行排名?的主要内容,如果未能解决你的问题,请参考以下文章

根据列中的一组查找最大值行并在熊猫中进行透视

根据一列中的字符串进行分组和排名

根据来自另一个表的匹配行查找表中的一组行

根据包含数字和不包含数字的行对 CSV 中的行进行排序

如何填充一列以区分 Impala 组中的一组行与其他行?

注释掉 shell 脚本中的一组行