Есть ли в Spark функция, которая может вычислить среднее значение столбца в DataFrame, игнорируя null/NaN? Как и в R, мы можем передать такую опцию, как na.rm=TRUE.
Когда я применяю avg() к столбцу с NaN, я получаю только NaN.
Есть ли в Spark функция, которая может вычислить среднее значение столбца в DataFrame, игнорируя null/NaN? Как и в R, мы можем передать такую опцию, как na.rm=TRUE.
Когда я применяю avg() к столбцу с NaN, я получаю только NaN.
Вы можете сделать следующее:
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