Рассмотрим набор данных с рейтингом
+--------+----+-----------+--------------+
| 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"))