Вы можете использовать функции Window
для создания столбца ранга на основе value
, разделенного на group_id
:
from pyspark.sql.window import Window
from pyspark.sql.functions import rank, dense_rank
# Define window
window = Window.partitionBy(df['group_id']).orderBy(df['value'])
# Create column
df.select('*', rank().over(window).alias('index')).show()
+--------+-----+-----+
|group_id|value|index|
+--------+-----+-----+
| 1| -1.7| 1|
| 1| 0.0| 2|
| 1| 1.3| 3|
| 1| 2.7| 4|
| 1| 3.4| 5|
| 2| 0.8| 1|
| 2| 2.3| 2|
| 2| 5.9| 3|
+--------+-----+-----+
. Поскольку вы сначала выбираете '*'
, вы сохраняете все остальные переменные, используя вышеуказанный код. Однако ваш второй пример показывает, что вы ищете функцию dense_rank()
, которая дает в качестве столбца рангов без пробелов:
df.select('*', dense_rank().over(window).alias('index'))