[英]Pandas DataFrame conditional forward filling based on first row values
[英]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.