python - 数据框 pyspark 从前一行更新行
问题描述
我正在使用 pyspark,我有一个看起来像这样的数据框:
CODE | POSITION| COL1 | COL2
A | 1 | |
A | 2 | | AAA
A | 3 | INF |
A | 4 | BIC |
A | 5 | |
B | 1 | | BBB
B | 2 | MIL |
B | 3 | |
B | 4 | | CCC
B | 5 | |
B | 6 | |
我想要那个:
CODE | POSITION| COL1 | COL2
A | 1 | |
A | 2 | | AAA
A | 3 | INF | AAA
A | 4 | BIC | AAA
A | 5 | |
B | 1 | | BBB
B | 2 | MIL | BBB
B | 3 | |
B | 4 | | CCC
B | 5 | |
B | 6 | |
我解释一下,这个数据帧按“CODE”分组并按“POSITION”排序,我需要一个“CODE”组,当我填充“COL2”(本例中的位置=2)时取值“AAA”和将其放在以下位置 3 和 4 (同时填充 COL1)
我知道这并不容易(对我来说!)
非常感谢您的帮助
解决方案
可以使用last
函数来完成。
F.last
返回有序窗口中的最后一个非空值。
您的数据框:
from pyspark.sql.functions import col
from pyspark.sql.functions import lag
from pyspark.sql.window import Window
from pyspark.sql import functions as F
import sys
df = sc.parallelize([['A', 1, None, None], ['A', 2, None, 'AAA'], ['A', 3, 'INF', None], ['A', 4, 'BIC', None], ['A', 5, None, None], ['B', 1, None, 'BBB'], ['B', 2, 'MIL', None], ['B', 3, None, None], ['B', 4, None, 'CCC'], ['B', 5, None, None], ['B', 6, None, None]])
df = df.toDF(['code', 'position', 'col1', 'col2'])
w = Window.partitionBy("code").orderBy("position")
df.withColumn("col3", F.last('col2', True).over(w.rowsBetween(-sys.maxsize, 0)))\
.withColumn("col3", F.when(col("col1").isNull(), col("col2"))
.otherwise(col("col3")))\
.drop("col2").withColumnRenamed("col3", "col2")\
.orderBy("code", "position").show()
输出:
+----+--------+----+----+
|code|position|col1|col2|
+----+--------+----+----+
| A| 1|null|null|
| A| 2|null| AAA|
| A| 3| INF| AAA|
| A| 4| BIC| AAA|
| A| 5|null|null|
| B| 1|null| BBB|
| B| 2| MIL| BBB|
| B| 3|null|null|
| B| 4|null| CCC|
| B| 5|null|null|
| B| 6|null|null|
+----+--------+----+----+
如果填写了col1
对应的position 6
,则会返回CCC
in col2
。它在窗口中前进时
采用最新的非空值。col2
+----+--------+----+----+
| B| 6| XYZ| CCC|
+----+--------+----+----+
推荐阅读
- java - 如何从 AWS API Gateway 自定义授权方检索 Spring Boot 中的上下文对象?
- java - 如何使用 Mockito 更改模拟对象中的值
- javascript - easygettext - gettext-extract Unexpected token )
- flutter - GeolocatorPlugin.m 中的颤振语义和解析问题
- azure - ARM 模板 - 获取函数的特定主机密钥
- assembly - Mips 在 mips 代码中发现结构危险数据危险
- javascript - 只有没有正则表达式的数字文本输入
- c# - 使用表达式创建强类型变量名称列表
- python - 将 3D 值数组绘制为网格上的彩色点
- python - 用 1 dict 代替 2 dict 得到结果