【问题标题】:Apply StringIndexer to change columns in a PySpark Dataframe应用 StringIndexer 更改 PySpark 数据框中的列
【发布时间】: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")

【问题讨论】:

    标签: pyspark pyspark-sql


    【解决方案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|
    # +-----------+-----+
    

    【讨论】:

      猜你喜欢
      • 2016-08-24
      • 2018-01-09
      • 2016-03-08
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多