应用 StringIndexer 更改 PySpark 数据框中的列

Posted

技术标签:

【中文标题】应用 StringIndexer 更改 PySpark 数据框中的列【英文标题】:Apply StringIndexer to change columns in a PySpark Dataframe 【发布时间】:2019-10-13 23:26:45 【问题描述】:

我是 pyspark 的新手。我想应用 StringIndexer 将列的值更改为索引。 我检查了这篇文章: Apply StringIndexer to several columns in a PySpark Dataframe

此解决方案将创建一个新列,而不是更新输入列。有没有办法更新当前列?我尝试使用相同的名称输入和输出,但它不起作用。

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

【问题讨论】:

【参考方案1】:

您不能简单地更新该列。但是你能做的是

使用 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|
# +-----------+-----+

【讨论】:

以上是关于应用 StringIndexer 更改 PySpark 数据框中的列的主要内容,如果未能解决你的问题,请参考以下文章

spark过滤算子+StringIndexer算子出发的一个逻辑bug

PySpark在嵌套数组中反转StringIndexer

什么是 StringIndexer 、 VectorIndexer 以及如何使用它们?

特征处理1_StringIndexer与OneHotEncoder

Spark StringIndexer和IndexToString

Spark ml pipeline - transforming feature - StringIndexer