Примените StringIndexer для изменения столбцов в кадре данных PySpark - PullRequest
1 голос
/ 14 октября 2019

Я новичок в pyspark. Я хочу применить StringIndexer, чтобы изменить значение столбца на индекс. Я проверил этот пост: Применить StringIndexer к нескольким столбцам в фрейме данных PySpark

Это решение создаст новый столбец, а не обновит входной столбец. Есть ли способ обновить текущий столбец? Я пытался использовать одно и то же имя для ввода и вывода, но оно не работает.

label_stringIdx = StringIndexer(inputCol ="WindGustDir", outputCol = "WindGustDir_index")

1 Ответ

0 голосов
/ 14 октября 2019

Вы не можете просто обновить этот столбец. Но вы можете

  • создать новый столбец с помощью StringIndexer

  • удалить исходный столбец

  • переименуйте новый столбец с именем исходного столбца

Вы можете использовать этот код

from pyspark.ml.feature import StringIndexer
import pyspark.sql.functions as F


df = spark.createDataFrame([['a', 1], ['b', 1], ['c', 2], ['b', 5]], ['WindGustDir', 'value'])
df.show()
# +-----------+-----+
# |WindGustDir|value|
# +-----------+-----+
# |          a|    1|
# |          b|    1|
# |          c|    2|
# |          b|    5|
# +-----------+-----+

# 1. create new column
label_stringIdx = StringIndexer(inputCol ="WindGustDir", outputCol = "WindGustDir_index")
label_stringIdx_model = label_stringIdx.fit(df)
df = label_stringIdx_model.transform(df)

# 2. delete original column
df = df.drop("WindGustDir")

# 3. rename new column
to_rename = ['WindGustDir_index', 'value']
replace_with = ['WindGustDir', 'value']
mapping = dict(zip(to_rename, replace_with))
df = df.select([F.col(c).alias(mapping.get(c, c)) for c in to_rename])

df.show()

# +-----------+-----+
# |WindGustDir|value|
# +-----------+-----+
# |        1.0|    1|
# |        0.0|    1|
# |        2.0|    2|
# |        0.0|    5|
# +-----------+-----+
...