繁体   English   中英

根据之前的值向前填充 pyspark dataframe

[英]Forward filling pyspark dataframe based on previous values

我有两个完全外部连接的 spark 数据框。

df1 = spark.createDataFrame(pd.DataFrame([[1,5,[1,2]],[1,15,[1,3]],[2,4,[3,4]]], 
                             columns=["id","day","state"]))
df2 = spark.createDataFrame(pd.DataFrame([[1,10,[5,6]],[1,12,[7]],[2,4,[3]],
                            [2,6,[10,12]],[2,10,[8,9]]], columns=["id","day","action"]))
df1.join(df2, on=["id","day"], how="fullouter").orderBy("id","day").show()

得到的output如下图

+---+---+------+--------+
| id|day| state|  action|
+---+---+------+--------+
|  1|  5|[1, 2]|    null|
|  1| 10|  null|  [5, 6]|
|  1| 12|  null|     [7]|
|  1| 15|[1, 3]|    null|
|  2|  4|[3, 4]|     [3]|
|  2|  6|  null|[10, 12]|
|  2| 10|  null|  [8, 9]|
+---+---+------+--------+

我需要 output 看起来像下面显示的那样,即需要将同一 ID 中的最后一个 state 复制下来。 null 动作被[0]取代。 这两个数据框都非常大。

+---+---+------+--------+
| id|day| state|  action|
+---+---+------+--------+
|  1|  5|[1, 2]|     [0]|
|  1| 10|[1, 2]|  [5, 6]|
|  1| 12|[1, 2]|     [7]|
|  1| 15|[1, 3]|     [0]|
|  2|  4|[3, 4]|     [3]|
|  2|  6|[3, 4]|[10, 12]|
|  2| 10|[3, 4]|  [8, 9]|
+---+---+------+--------+

您可以使用 Pyspark 的last function 来检索 window 中的最后一个值; ignorenulls=True是检索最后一个非空值所需的参数。
相反,要在数组列中填充 NA,我们需要使用此答案中提出的相同方法,因为.fillna不支持 arrays。

import pyspark.sql.functions as F
from pyspark.sql.window import Window

# window to determine last value
w = Window.partitionBy('id').orderBy('day').rangeBetween(Window.unboundedPreceding, 0)

# `df` is your outer-joined dataframe
(df
 .withColumn('state', F.last('state', ignorenulls=True).over(w))
 .withColumn('action', F.when(F.col('action').isNull(), F.array(F.lit(0))).otherwise(F.col('action')))
).show()

+---+---+------+--------+
| id|day| state|  action|
+---+---+------+--------+
|  1|  5|[1, 2]|     [0]|
|  1| 10|[1, 2]|  [5, 6]|
|  1| 12|[1, 2]|     [7]|
|  1| 15|[1, 3]|     [0]|
|  2|  4|[3, 4]|     [3]|
|  2|  6|[3, 4]|[10, 12]|
|  2| 10|[3, 4]|  [8, 9]|
+---+---+------+--------+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM