Pyspark: Преобразование плотного вектора в столбцы

#python #pyspark

Вопрос:

У меня есть фрейм данных с четырьмя столбцами, один из которых представляет собой плотный вектор.

cust_id этикетка предсказание вероятность
1 0 0 {«Тип вектора»:»плотный»,»длина»:2,»значения»:[0,5745528913772013,0,4254471086227987]}
2 0 0 {«Тип вектора»:»плотный»,»длина»:2,»значения»:[0,5185219003114524,0,4814780986885476]}
3 0 1 {«Тип вектора»:»плотный»,»длина»:2,»значения»:[0,37871114732242217,0,6212888526775778]}
4 0 1 {«Тип вектора»:»плотный»,»длина»:2,»значения»:[0,4352110724347864,0,5647889275652135]}
5 1 1 {«Тип вектора»:»плотный»,»длина»:2,»значения»:[0,49476519185173606,0,505234808148264]}

Я хочу преобразовать плотный вектор в столбцы и сохранить выходные данные вместе с остальными столбцами.

cust_id этикетка предсказание split_int[0] split_int[1]
1 0 0 0.574552891 0.425447109
2 0 0 0.5185219 0.4814781
3 0 1 0.378711147 0.621288853
4 0 1 0.435211072 0.564788928
5 1 1 0.494765192 0.505234808

Я нашел в Интернете какой-то код и смог разделить плотный вектор.

 import pyspark.sql.functions as F
from pyspark.sql.types import ArrayType, DoubleType

def split_array_to_list(col):
    def to_list(v):
        return v.toArray().tolist()
    return F.udf(to_list, ArrayType(DoubleType()))(col)

df3 = selected.select(split_array_to_list(F.col("probability")).alias("split_int")).select([F.col("split_int")[i] for i in range(2)])
df3.show()
 

Как я могу добавить другие столбцы? Я пробовал это, но получил
Ошибка типа: объект «Столбец» не вызывается

 df3 = selected.select(F.col("cust_id")   ((split_array_to_list(F.col("probability")).alias("split_int")).select([F.col("split_int")[i] for i in range(2)])))
 

Комментарии:

1. что selected.printSchema() печатается?

2. он дает cust_id: целое число, метку: целое число, прогноз: целое число, вероятность: вектор.

Ответ №1:

Попробуйте withColumn при использовании вашего udf

 df3 = selected.withColumn("split_int", split_array_to_list(F.col("probability"))).select(F.col("*"), *[F.col("split_int")[i] for i in range(2)])