首页 > 解决方案 > 数据框 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)

我知道这并不容易(对我来说!)

非常感谢您的帮助

标签: pythondataframepyspark

解决方案


可以使用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,则会返回CCCin col2。它在窗口中前进时
采用最新的非空值。col2

+----+--------+----+----+
|   B|       6| XYZ| CCC|
+----+--------+----+----+

推荐阅读