【问题标题】:Pyspark: Forward filling nulls with last valuePyspark:用最后一个值前向填充空值
【发布时间】:2020-08-14 05:42:40
【问题描述】:

我有一个类似这样的数据框:

values = [
    ("2019-10-01", "004", 1.0),
    ("2019-10-02", "005", None),
    ("2019-10-03", "004", 2.0),
    ("2019-10-04", "004", 1.0),
    ("2019-10-05", "006", None)

] 

df = spark.createDataFrame(values, ['time', 'mode', 'value'])

我想用之前的非空值填充最后一列中的 None。

    ("2019-10-01", "004", 1.0),
    ("2019-10-02", "005", 1.0),
    ("2019-10-03", "004", 2.0),
    ("2019-10-04", "004", 1.0),
    ("2019-10-05", "006", 1.0)

我试过了:

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

df_2 = df.withColumn("value2", f.last('value', ignorenulls=True).over(Window.orderBy('time').rowsBetween(Window.unboundedPreceding, 0)))

这不起作用,因为新列中仍有空值。 如何向前填充最后一列?

【问题讨论】:

    标签: python pandas apache-spark pyspark data-science


    【解决方案1】:

    你的窗口有一个小错误,试试这个:

    from pyspark.sql import functions as f, Window
    
    window_last = Window.orderBy("time")
    
    df_2 = df.withColumn("value2", f.last("value", ignorenulls=True).over(window_last))
    

    结果:

    +----------+----+-----+------+
    |      time|mode|value|value2|
    +----------+----+-----+------+
    |2019-10-01| 004|  1.0|   1.0|
    |2019-10-02| 005| null|   1.0|
    |2019-10-03| 004|  2.0|   2.0|
    |2019-10-04| 004|  1.0|   1.0|
    |2019-10-05| 006| null|   1.0|
    +----------+----+-----+------+
    

    【讨论】:

    • 这也不适用于我的数据集,我仍然得到空值。我的数据集的特点是它主要包含空值作为值和几个非空值(两个值之间有数千个空值)。
    • 我解决了。问题是我有太多数据(带有空值)。我将整个数据集过滤到最相关的行,然后它就起作用了
    • 数据集的大小不会改变这个函数的行为方式。我相信您的数据集以空值开始,并在其第一个非空值出现之前保持空值一段时间。
    猜你喜欢
    • 2015-07-22
    • 2017-07-19
    • 2015-09-17
    • 1970-01-01
    • 2021-10-25
    • 2016-07-01
    • 1970-01-01
    • 2022-07-22
    • 2019-10-28
    相关资源
    最近更新 更多