仅标记组 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()
我有一个数据框如下:
+---------+-----+----------+
| 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()