如何提取数据框中更改 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】:

使用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)
+---+----+-----+

【讨论】:

以上是关于如何提取数据框中更改 id-value 的行?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据严重性更改数据网格中的行颜色?

根据列值从熊猫数据框中提取行

从数据框中提取具有最小值或最大值的行

从 Access 中的列表框中提取选定的行

更改熊猫数据框中随机选择的行的顺序

R语言中提取两个数据框中完全相同的行及保留唯一行