我试图从数据框中仅提取ID更改的行:假设我们具有以下数据框:
# id Date Value
# 152 12/4 True
# 152 12/4 True
# 152 12/4 True
# 158 12/4 True
# 158 13/4 False
# 158 13/4 False
我想仅在更改ID和预览行时使用值创建新的数据框:
# id Date Value
# 152 12/4 True
# 158 12/4 True
我尝试使用滞后和窗口功能,但效果不佳。预先感谢。
答案 0 :(得分:1)
使用lag
和lead
,这是一个解决方案。根据您的要求,当id更改时,它将选择当前行以及上一行。我修改了测试数据以涵盖其他情况
from pyspark.sql.window import Window
import pyspark.sql.functions as F
df = spark.createDataFrame([[151, '12/4', True],
[152, '12/4', True],
[152, '12/4', True],
[158, '12/4', True],
[158, '12/4', True],
[158, '12/4', True]
], schema=['id', 'Date', 'Value'])
window = Window.orderBy("id")
df = df.withColumn("prev_id", F.lag(F.col("id")).over(window))
df = df.withColumn("next_id", F.lead(F.col("id")).over(window))
df.filter(
'id != next_id or id != prev_id'
).drop(
'prev_id','next_id'
).show()
结果
+---+----+-----+
| id|Date|Value|
+---+----+-----+
|151|12/4| true|
|152|12/4| true| (Id changed, so select and previous row)
|152|12/4| true|
|158|12/4| true| (Id changed, so select and previous row)
+---+----+-----+