火花 >= 2.2
您可以使用org.apache.spark.ml.feature.Imputer
(支持均值和中值策略)。
斯卡拉:
import org.apache.spark.ml.feature.Imputer
val imputer = new Imputer()
.setInputCols(df.columns)
.setOutputCols(df.columns.map(c => s"${c}_imputed"))
.setStrategy("mean")
imputer.fit(df).transform(df)
蟒蛇:
from pyspark.ml.feature import Imputer
imputer = Imputer(
inputCols=df.columns,
outputCols=["{}_imputed".format(c) for c in df.columns]
)
imputer.fit(df).transform(df)
火花 < 2.2
给你:
import org.apache.spark.sql.functions.mean
df.na.fill(df.columns.zip(
df.select(df.columns.map(mean(_)): _*).first.toSeq
).toMap)
在哪里
df.columns.map(mean(_)): Array[Column]
计算每列的平均值,
df.select(_: *).first.toSeq: Seq[Any]
收集聚合值并将行转换为Seq[Any]
(我知道它不是最理想的,但这是我们必须使用的 API),
df.columns.zip(_).toMap: Map[String,Any]
创建aMap: Map[String, Any]
从列名到其平均值的映射,最后:
df.na.fill(_): DataFrame
使用以下方法填充缺失值:
fill: Map[String, Any] => DataFrame
从DataFrameNaFunctions
.
要引入NaN
条目,您可以替换:
df.select(df.columns.map(mean(_)): _*).first.toSeq
和:
import org.apache.spark.sql.functions.{col, isnan, when}
df.select(df.columns.map(
c => mean(when(!isnan(col(c)), col(c)))
): _*).first.toSeq