我想知道生成列index
的最有效方法
在每个标签组中唯一标识的记录:
+-------+-------+-------+
| label | value | index |
+-------+-------+-------+
| a | v1 | 0 |
+-------+-------+-------+
| a | v2 | 1 |
+-------+-------+-------+
| a | v3 | 2 |
+-------+-------+-------+
| a | v4 | 3 |
+-------+-------+-------+
| b | v5 | 0 |
+-------+-------+-------+
| b | v6 | 1 |
+-------+-------+-------+
我的实际数据非常大,每组标签都有相同的记录数。列索引将用于Pivot。 我可以做通常的排序+ for循环增量+检查如果cur<> pre然后重置索引等,但总是欢迎更快更有效的方式。
编辑:从建议的问题中得到答案:from pyspark.sql import Row, functions as F
from pyspark.sql.window import Window
df = df.withColumn("index",
F.row_number().over(
Window.partitionBy("label").orderBy("value"))
)
感谢您的帮助!
答案 0 :(得分:0)
您可以使用Window
函数在label
列上进行分区时创建基于排名的列。但是,这需要订购 - 在本例中为value
:
from pyspark.sql.window import Window
from pyspark.sql.functions import row_number
window = Window.partitionBy(df['label']).orderBy(df['value'])
df.withColumn('index', row_number().over(window))
这将为新列index
提供从1开始的值(从0开始,只需将-1
添加到上面的表达式中)。这些值将按value
列的顺序给出。