我想我有一些相当简单的东西。
我试图实现的是每组,如果满足特定条件,则给出增加的数字(排名?)。对于每组,它从 1 开始,如果满足条件,则下一行是上一行的值 +1。这样在组内越走越远,每次满足条件就加1。
下表可能会更清楚地显示这一点。 (我尝试创建的是“what_i_want”列)
group to_add_number what_i_want
aaaaaa 0 1
aaaaaa 0 1
aaaaaa 1 2
aaaaaa 0 2
aaaaaa 0 2
aaaaaa 1 3
aaaaaa 0 3
aaaaaa 0 3
bbbbbb 0 1
bbbbbb 1 2
bbbbbb 1 3
bbbbbb 0 3
cccccc 0 1
cccccc 0 1
cccccc 0 1
cccccc 1 2
我认为窗口函数(滞后)可能会做到这一点,但我无法做到这一点。
我尝试的是:
from pyspark.sql.functions import lit,when,lag,row_number
from pyspark.sql.window import Window
windowSpec=Window.partitionBy('group')
df=df.withColumn('tmp_rnk',lit(1))
df=df.withColumn('what_i_want',when(col('to_add_number')==0,lag('tmp_rnk').over(windowSpec)).otherwise(col('what_i_want')+1)
or
df=df.withColumn('tmp_rnk',lit(1))
df=df.withColumn('row_number_rank',row_number().over(windowSpec))
df=df.withColumn('what_i_want',when((col('to_add_number')==0)&(col('row_number_rank')==1)
,lit(1)
.when(col('to_add_number')==0)&(col('row_number_rank')>1),lag('what_i_want').over(windowSpec).otherwise(col('what_i_want')+1)
我尝试了几种变体,根据“条件窗口函数”、“滞后、领先……”在堆栈溢出上进行搜索,但没有任何效果,或者我没有找到重复的问题。