给定Spark数据帧,我想基于该列的非缺失值和非未知值计算列平均值.然后我想采取这个意思并用它来替换列的缺失和未知值.
例如,假设我正在使用:
然后我可以计算出这个均值,如下所示.
calc_mean = df.where((col("unknown_age") == 0) & (col("missing_age") == 0))
.agg(avg(col("age")))
Run Code Online (Sandbox Code Playgroud)
或者通过SQL和Windows函数,
mean_compute = hiveContext.sql("select avg(age) over() as mean from df
where missing_age = 0 and unknown_age = 0")
Run Code Online (Sandbox Code Playgroud)
我不希望使用SQL/Windows的功能,如果我能帮助它.我的挑战是采用这种方法并使用非SQL方法替换未知/缺失值.
我已经尝试过使用when(),where(),replace(),withColumn,UDF和组合......无论我做什么,我都会得到错误或结果不是我所期望的.这是我尝试过的很多东西之一的例子.
imputed = df.when((col("unknown_age") == 1) | (col("missing_age") == 1),
calc_mean).otherwise("age")
Run Code Online (Sandbox Code Playgroud)
我已经搜索过网络,但没有找到类似的插补类型问题,所以任何帮助都非常感谢.这可能是我错过的非常简单的事情.
附注 - 我正在尝试将此代码应用于Spark Dataframe中列名中没有unknown_或missing_的所有列.我可以将Spark相关代码包装在Python'for循环'中并循环遍历所有适用的列来执行此操作吗?
更新:
还想出了如何遍历列...这是一个例子.
for x in df.columns:
if 'unknown_' not in x and 'missing_' not in x:
avg_compute = df.where(df['missing_' + x] != 1).agg(avg(x)).first()[0]
df = df.withColumn(x …Run Code Online (Sandbox Code Playgroud)