如何提取在数据框中更改ID值的行?

时间:2019-08-07 11:45:07

标签: dataframe pyspark

我试图从数据框中仅提取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

我尝试使用滞后和窗口功能,但效果不佳。预先感谢。

1 个答案:

答案 0 :(得分:1)

使用laglead,这是一个解决方案。根据您的要求,当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)
+---+----+-----+