【问题标题】:How to split column of vectors into two columns?如何将向量列分成两列?
【发布时间】:2016-09-15 15:40:17
【问题描述】:

我使用 PySpark。

Spark ML 的随机森林输出 DataFrame 有一列“概率”,它是一个包含两个值的向量。我只想在输出DataFrame中添加两列,“prob1”和“prob2”,分别对应向量中的第一个和第二个值。

我尝试了以下方法:

output2 = output.withColumn('prob1', output.map(lambda r: r['probability'][0]))

但我收到“col 应该是列”的错误。

关于如何将一列向量转换为其值列的任何建议?

【问题讨论】:

    标签: apache-spark pyspark apache-spark-ml


    【解决方案1】:

    我发现了上面建议的问题。在 pyspark 中,“密集向量简单地表示为 NumPy 数组对象”,所以问题在于 python 和 numpy 类型。需要添加 .item() 将 numpy.float64 转换为 python 浮点数。

    以下代码有效:

    split1_udf = udf(lambda value: value[0].item(), FloatType())
    split2_udf = udf(lambda value: value[1].item(), FloatType())
    
    output2 = randomforestoutput.select(split1_udf('probability').alias('c1'), split2_udf('probability').alias('c2'))
    

    或者将这些列附加到原始数据框:

    randomforestoutput.withColumn('c1', split1_udf('probability')).withColumn('c2', split2_udf('probability'))
    

    【讨论】:

      【解决方案2】:

      遇到了同样的问题,下面是针对你有 n 长度向量的情况调整的代码。

      splits = [udf(lambda value: value[i].item(), FloatType()) for i in range(n)]
      out =  tstDF.select(*[s('features').alias("Column"+str(i)) for i, s in enumerate(splits)])
      

      【讨论】:

        【解决方案3】:

        您可能希望使用一个 UDF 来提取第一个值,并使用另一个 UDF 来提取第二个值。然后,您可以在随机 forrest 数据帧的输出上使用带有 select 调用的 UDF。示例:

        from pyspark.sql.functions import udf, col
        
        split1_udf = udf(lambda value: value[0], FloatType())
        split2_udf = udf(lambda value: value[1], FloatType())
        output2 = randomForrestOutput.select(split1_udf(col("probability")).alias("c1"),
                                             split2_udf(col("probability")).alias("c2"))
        

        这应该会为您提供一个数据框 output2,其中 c1 和 c2 列对应于存储在列概率中的列表中的第一个和第二个值。

        【讨论】:

        【解决方案4】:

        我尝试了@Rookie Boy 的循环,但似乎 splits udf 循环对我不起作用。 我稍微修改了一下。

        out = df
        for i in range(len(n)):
            splits_i = udf(lambda x: x[i].item(), FloatType())
            out = out.withColumn('{col_}'.format(i), splits_i('probability'))
        out.select(*['col_{}'.format(i) for i in range(3)]).show()
        

        【讨论】:

          猜你喜欢
          • 2023-02-21
          • 1970-01-01
          • 2017-10-05
          • 1970-01-01
          • 1970-01-01
          • 2019-11-25
          • 1970-01-01
          • 2020-04-21
          • 1970-01-01
          相关资源
          最近更新 更多