我有一个具有这种结构的数据框
订单号 | 行号 | 项目 | 类型 |
---|---|---|---|
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 列来进行检查,但无法完全确定逻辑。我觉得我需要不止一篇专栏,但无法做到。
我还尝试了一个窗口函数来按行号将它们“分组”在一起,按订单号和类型进行分区,但这不起作用,因为它将父母与孩子分开。
试试这个:
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|
+------------+-----------+----+------+-----------+