如何将向量列拆分为两列?

7
我使用 PySpark。
Spark ML 的随机森林输出 DataFrame 包含一个名为“probability”的向量列,其中包含两个值。我只想将两个列添加到输出 DataFrame 中,“prob1”和“prob2”,这两个列对应于向量中的第一个和第二个值。
我尝试了以下方法:
output2 = output.withColumn('prob1', output.map(lambda r: r['probability'][0]))

但我收到了“col应该是Column”的错误提示。

有什么建议可以将向量列转换为其值的列?

4个回答

3

我也遇到了同样的问题,以下是根据你拥有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
我找到了上述建议的问题所在。在pyspark中,“密集向量仅表示为NumPy数组对象”,因此问题出现在python和numpy类型中。需要添加`.item()`将numpy.float64转换为python float。
以下代码有效:
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

您可能需要使用一个UDF来提取第一个值,另一个UDF来提取第二个值。然后,您可以将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"))

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

1
我尝试了你的建议,但是它产生了一个错误,类似于这里提到的错误:https://dev59.com/4V0a5IYBdhLWcg3w07gt - Petrichor

0

我尝试了@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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接