Pyspark -> StringIndexer: значение «None» заменяется числом - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть фрейм данных, который имеет несколько значений «None». После преобразования строковых столбцов в плавающие столбцы с помощью StringIndexer значения «None» заменяются числом.

Вопрос: Как я могу преобразовать строковые столбцы в плавающие столбцы, но сохранить значения «None» как «None»?

Спасибо.

# Transform nominal attributes to numeric attributes
for columnName, columnType in self.rawData.dtypes:
    if columnType == "string":
        self.rawData = PreProcess.TransformNominalToNumeric(self.rawData, columnName)



class PreProcess:
    @staticmethod
    def TransformNominalToNumeric(dataFrame, inputColumn):
        """Transformation of nominal attributes into numeric"""
        outputColumn = inputColumn + "_index"
        indexer = StringIndexer(inputCol = inputColumn, outputCol = outputColumn, handleInvalid = "keep")
        indexer = indexer.fit(dataFrame)
        dataFrame = indexer.transform(dataFrame)
        dataFrame = dataFrame.drop(inputColumn)
        dataFrame = dataFrame.withColumnRenamed(outputColumn, inputColumn)
        return dataFrame

1 Ответ

0 голосов
/ 29 апреля 2018

С 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 с, поэтому вам необходимо вменять, отбрасывать и кодировать (как здесь), в зависимости от типа и требований, прежде чем продолжить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...