【发布时间】:2019-03-17 06:23:07
【问题描述】:
Spark 中是否有任何函数可以通过忽略 null/NaN 来计算 DataFrame 中列的平均值?就像在 R 中一样,我们可以传递一个选项,例如 na.rm=TRUE。
当我对带有 NaN 的列应用 avg() 时,我只得到 NaN。
【问题讨论】:
标签: apache-spark pyspark apache-spark-sql
Spark 中是否有任何函数可以通过忽略 null/NaN 来计算 DataFrame 中列的平均值?就像在 R 中一样,我们可以传递一个选项,例如 na.rm=TRUE。
当我对带有 NaN 的列应用 avg() 时,我只得到 NaN。
【问题讨论】:
标签: apache-spark pyspark apache-spark-sql
您可以执行以下操作:
df.na.drop(Seq("c_name")).select(avg(col("c_name")))
【讨论】:
在所有列中创建一个没有空值的数据框,以便可以在下一步中计算列平均值
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])
【讨论】:
这似乎在 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
【讨论】: