Pyspark - 重复值直到列发生变化

问题描述 投票:0回答:1

我有一个具有这种结构的数据框

订单号 行号 项目 类型
12345 1 1001 家长
12345 2 1002 孩子
12345 3 1003 孩子
12345 4 1004 孩子
12345 5 1005 家长
12345 6 1006 孩子

我想添加一列,显示每个项目的“父项目”。父项是每个子项遵循的第一个父类型。没有可供使用的关系或链接。行号决定了每个父母的孩子。

行号 项目 类型 父项
1 1001 家长 1001
2 1002 孩子 1001
3 1003 孩子 1001
4 1004 孩子 1001
5 1005 家长 1005
6 1006 孩子 1005

父项编号必须重复,直到找到新的父项。我尝试添加 LAG 列来进行检查,但无法完全确定逻辑。我觉得我需要不止一篇专栏,但无法做到。

我还尝试了一个窗口函数来按行号将它们“分组”在一起,按订单号和类型进行分区,但这不起作用,因为它将父母与孩子分开。

python dataframe apache-spark pyspark apache-spark-sql
1个回答
0
投票

试试这个:

df = (
    df.withColumn(
        "cumsum",
        F.sum(F.when(F.col("Type") == "Parent", 1).otherwise(0)).over(
            Window.partitionBy("Order Number").orderBy("Line Number")
        ),
    )
    .withColumn(
        "Parent_Item",
        F.first(
            F.when(F.col("Type") == "Parent", F.col("Item")), ignorenulls=True
        ).over(Window.partitionBy("Order Number", "cumsum")),
    )
    .drop(F.col("cumsum"))
)

df.show()

输出:

+------------+-----------+----+------+-----------+
|Order Number|Line Number|Item|  Type|Parent_Item|
+------------+-----------+----+------+-----------+
|       12345|          1|1001|Parent|       1001|
|       12345|          2|1002| Child|       1001|
|       12345|          3|1003| Child|       1001|
|       12345|          4|1004| Child|       1001|
|       12345|          5|1005|Parent|       1005|
|       12345|          6|1006| Child|       1005|
+------------+-----------+----+------+-----------+
© www.soinside.com 2019 - 2024. All rights reserved.