#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)])