仅标记组 PySpark 的列值的第一次更改

Mark only first change in column values for a group PySpark

我有一个数据框如下:

+---------+-----+----------+
|  tx_grp |offer|old_offer |
+---------+-----+----------+
|Company_B|   10|      null| 
|Company_B|   10|      null| 
|Company_B|   12|        10|  
|Company_B|   12|        10|  
|Company_A|  101|      null| 
|Company_A|  101|      null|
|Company_A|  109|       101| 
|Company_A|  109|       101| 
+---------+-----+----------+

我试过: df = df.withColumn('isChanged',when(F.col('offer')!=F.col('old_offer'),'yes')。否则(0))

但我得到:

+---------+-----+----------+---------+
|  tx_grp |offer|old_offer |isChanged|
+---------+-----+----------+---------+
|Company_B|   10|      null|   0     |
|Company_B|   10|      null|   0     |
|Company_B|   12|        10| yes     |
|Company_B|   12|        10| yes     |
|Company_A|  101|      null|   0     |
|Company_A|  109|       101|  yes    |
|Company_A|  109|       101|  yes    |
|Company_A|  109|       101|  yes    |
+---------+-----+----------+---------+

我只想标记更改的第一个事件,我该如何实现。 我想要的是:

+---------+-----+----------+---------+
|  tx_grp |offer|old_offer |isChanged|
+---------+-----+----------+---------+
|Company_B|   10|      null|   0     |
|Company_B|   10|      null|   0     |
|Company_B|   12|        10|  yes    |
|Company_B|   12|        10|   0     |
|Company_A|  101|      null|   0     |
|Company_A|  109|       101|  yes    |
|Company_A|  109|       101|   0     |
|Company_A|  109|       101|   0     |
+---------+-----+----------+---------+

使用window函数

 w=Window.partitionBy('tx_grp').orderBy(desc('tx_grp'))
    
(df.withColumn('ischanged', lag('old_offer').over(w)).na.fill(0).withColumn('ischanged', when(col('ischanged')==col('old_offer'),'0').otherwise('yes'))
).show()