【问题标题】:How do forward fill missing value imputation for a PySpark dataframe with single column?如何为具有单列的 PySpark 数据框前向填充缺失值插补?
【发布时间】:2019-01-14 00:29:08
【问题描述】:

我有一个单列的 PySpark 数据框。

| Rank  
|----------
| 10
| 10
| null   
| null     
| 15
| null
| 20
| null     
| null     
| 15
| null   
| 10

我想使用 pandas ffill() 函数之类的前向填充来估算缺失值。

期望的输出

| Rank    
|----------
| 10
| 10
| 10   
| 10     
| 15
| 15
| 20
| 20     
| 20     
| 15
| 15   
| 10

免责声明:我在 stackoverflow 中有一些解决方案,但是当您只有一列作为输入时,它们将不起作用。

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-sql pyspark-sql


    【解决方案1】:

    请查看 spark 中的 lag 和 lead 函数。

    lag 和 Lead 仅用于获得一个偏移量。使用全局变量简单地创建 udf 应该可以解决问题 下面是一个简单的例子

    var PRV_RANK = 0f
    
    import spark.implicits._
    val data = spark.sparkContext.parallelize(Seq(10f, 10f, Float.NaN, Float.NaN, 15f, Float.NaN, 20f, Float.NaN, Float.NaN, 15f, Float.NaN, 10f))
      .toDF("rank")
    
    val forwardFill = udf((rank: Float) =>
    {
      if (rank == null || rank.equals(Float.NaN)){
        PRV_RANK
      }
      else {
        PRV_RANK = rank
        rank
      }
    })
    
    data.withColumn("rankNew", forwardFill($"rank")).show()
    

    希望这会有所帮助!

    【讨论】:

    • 你能分享代码的scala版本吗?我知道你擅长使用 scala 进行 Spark :D
    • 我已经更新了答案,我们无法处理多个空值的滞后和领先。
    • 没有。我不知道如何将这一行“(rank == null || rank.equals(Float.NaN)”转换为python
    • 如果rank是None或者math.isnan(rank)你可以这样做:
    • 如果这对你有用,你能接受作为答案吗?
    猜你喜欢
    • 2018-09-15
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    • 2018-12-17
    • 2020-12-07
    • 1970-01-01
    相关资源
    最近更新 更多