如何提取数据框中更改 id-value 的行?
Posted
技术标签:
【中文标题】如何提取数据框中更改 id-value 的行?【英文标题】:How to extract the rows that changed id-value in a dataframe? 【发布时间】:2019-08-07 11:45:07 【问题描述】:我试图从数据框中仅提取 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 更改和预览行时仅使用 Values 创建一个新的 Dataframe:
# id Date Value
# 152 12/4 True
# 158 12/4 True
我尝试了延迟和窗口功能,但没有得到好的结果。提前致谢。
【问题讨论】:
【参考方案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)
+---+----+-----+
【讨论】:
以上是关于如何提取数据框中更改 id-value 的行?的主要内容,如果未能解决你的问题,请参考以下文章