Dataframe 条件下分区中的Pypark枚举

Dataframe 条件下分区中的Pypark枚举,dataframe,pyspark,enumerate,Dataframe,Pyspark,Enumerate,我有一个pySpark数据帧,如: class classID Property 1 1 1 1 2 0 1 3 1 1 4 1 2 1 0 2 2 0 2 3 1 现在我需要添加一个列,其中包含当前分区中有多少行的信息,直到这一行的属性==1为止。就像这里: class classID Property r

我有一个pySpark数据帧,如:

class   classID Property
1       1       1
1       2       0
1       3       1
1       4       1
2       1       0   
2       2       0
2       3       1
现在我需要添加一个列,其中包含当前分区中有多少行的信息,直到这一行的属性==1为止。就像这里:

class   classID Property    relevantCount
1       1       1           1
1       2       0           1   
1       3       1           2
1       4       1           3
2       1       0           0   
2       2       0           0
2       3       1           1
例如,我尝试了一个窗口功能:

import pyspark.sql.functions as f
from pyspark.sql.window import Window
windowSpec = Window().partitionBy('class').orderBy(f.col('classID'))
df = df \
.withColumn('relevantCount',(f.when((f.col('rank') == f.lit(1)) & (f.col('Property') == f.lit(0)),0)).otherwise(f.col('Property')+f.col(f.lag('deliveryCountDesc').over(windowSpec))))
但我不能参考以前的新行值


有人有更好的主意吗?

您的窗口规范需要修改,以包含分区中以前的所有行,并使用匹配的属性值进行计数。 试试这个

import pyspark.sql.functions as f
from pyspark.sql.window import Window
data = [(1, 1,1),(1, 2,0),(1, 3,1),(1, 4,1),(2,1 , 0),(2, 2, 0),(2, 3, 1)]
df = spark.createDataFrame(data,['class','classID','Property'])
windowSpec = Window().partitionBy('class').orderBy('classID').rowsBetween(Window.unboundedPreceding, Window.currentRow)
df = df.withColumn('relevantCount',f.count(f.when(f.col('Property') == 1, f.col('Property'))).over(windowSpec))
df.show()
结果>

+-----+-------+--------+-------------+
|class|classID|Property|relevantCount|
+-----+-------+--------+-------------+
|    1|      1|       1|            1|
|    1|      2|       0|            1|
|    1|      3|       1|            2|
|    1|      4|       1|            3|
|    2|      1|       0|            0|
|    2|      2|       0|            0|
|    2|      3|       1|            1|
+-----+-------+--------+-------------+

有了你们的解释,我可以用Window做比我在阅读教程后所想的更多的事情。