Pyspark-等级列用等级平均值代替领带的等级

时间:2019-05-22 21:47:53

标签: python apache-spark pyspark window-functions ranking

考虑具有排名的数据集

 +--------+----+-----------+--------------+
 |    colA|colB|colA_rank  |colA_rank_mean|
 +--------+----+-----------+--------------+
 |      21|  50|          1|             1|
 |       9|  23|          2|           2.5|
 |       9|  21|          3|           2.5|
 |       8|  21|          4|             3|        
 |       2|  21|          5|           5.5|      
 |       2|   5|          6|           5.5|       
 |       1|   5|          7|           7.5|     
 |       1|   4|          8|           7.5|     
 |       0|   4|          9|            11|    
 |       0|   3|         10|            11|  
 |       0|   3|         11|            11| 
 |       0|   2|         12|            11|
 |       0|   2|         13|            11|
 +--------+----+-----------+--------------+

colA_rank是正常排名,而对于colA_rank_mean,我想通过将排名替换为平局的平均排名来解决平局。单次通过和某些特定的排名方法是否可以实现?

目前,我正在考虑进行2次传递,但这似乎需要在colA上对数据集进行两次排序,一次不进行分区,一次对进行分区。

#Step 1: normal rank
df = df.withColumn("colA_rank",F.row_number().over(Window.orderBy("colA")))
#Step 2 : solve ties :
df = df.withColumn("colA_rank_mean",F.mean(colA_rank).over(Window.partitionBy("colA"))

0 个答案:

没有答案