С keep
положить недопустимые данные в специальную дополнительную корзину с индексом numLabels
Вы можете заменить значения вручную после transform
from pyspark.sql.functions import col, when
dataFrame = spark.createDataFrame(["a", None, "b"], "string").toDF("value")
inputColumn = "value"
outputColumn = inputColumn + "_index"
indexer = StringIndexer(
inputCol=inputColumn, outputCol=outputColumn, handleInvalid="keep"
).fit(dataFrame)
(indexer
.transform(dataFrame)
.withColumn(outputColumn, when(col(outputColumn) == len(indexer.labels), None).otherwise(col(outputColumn)))
.show())
# +-----+-----------+
# |value|value_index|
# +-----+-----------+
# | a| 0.0|
# | null| null|
# | b| 1.0|
# +-----+-----------+
но если вы планируете использовать pyspark.ml
позже, в этом нет никакого значения. Алгоритм pyspark.ml
не принимает NULL
с, поэтому вам необходимо вменять, отбрасывать и кодировать (как здесь), в зависимости от типа и требований, прежде чем продолжить.