【问题标题】:Replace Null values of a column with its average in a Spark DataFrame用 Spark DataFrame 中的平均值替换列的 Null 值
【发布时间】:2019-03-17 06:23:07
【问题描述】:

Spark 中是否有任何函数可以通过忽略 null/NaN 来计算 DataFrame 中列的平均值?就像在 R 中一样,我们可以传递一个选项,例如 na.rm=TRUE。

当我对带有 NaN 的列应用 avg() 时,我只得到 NaN。

【问题讨论】:

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


    【解决方案1】:

    您可以执行以下操作:

    df.na.drop(Seq("c_name")).select(avg(col("c_name")))
    

    【讨论】:

      【解决方案2】:

      在所有列中创建一个没有空值的数据框,以便可以在下一步中计算列平均值

      removeAllDF = df.na.drop()
      

      创建一个列列表,其中的空值必须替换为列均值,并调用该列表“columns_with_nas”

      现在遍历列表“columns_with_nas”,用计算出的平均值替换所有空值

      for x in columns_with_nas:
          meanValue = removeAllDF.agg(avg(x)).first()[0]
          print(x, meanValue)
          df= df.na.fill(meanValue, [x])
      

      【讨论】:

        【解决方案3】:

        这似乎在 Spark 2.1.0 中对我有用:

        In [16]: mydesc=[{'name':'Fela', 'age':46},
                        {'name':'Menelik','age':None},
                        {'name':'Zara','age':39}]
        In [17]: mydf = sc.parallelize(mydesc).toDF()
        In [18]: from pyspark.sql.functions import avg
        In [20]: mydf.select(avg('age')).collect()[0][0]
        Out[20]: 42.5
        

        【讨论】:

          猜你喜欢
          • 2017-02-24
          • 2013-09-12
          • 2017-07-10
          • 2016-11-16
          • 2020-12-08
          • 2016-01-08
          • 1970-01-01
          相关资源
          最近更新 更多