Добавление значения столбца в массив в другом столбце, когда значение отсутствует

У меня есть фрейм данных со столбцом, который содержит массив, содержащий структуры формы (ключ, оценка), т.е. столбец значений ниже. Кроме того, у меня есть еще один столбец с именем item, который содержит строку.

root
 |-- value: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- key: string (nullable = true)
 |    |    |-- score: double (nullable = true)
 |-- id: string (nullable = true)
 |-- item: string (nullable = true)

Когда элемент не равен нулю, я хочу выполнить поиск в массиве, чтобы увидеть, присутствует ли элемент в value.key(s). Если его нет, добавьте (item, min) к массиву в столбце значений. Здесь min — это минимальное значение для оценок в массиве. Мне нужно сохранить порядок элементов в массиве и добавить новую структуру в конец списка.

Пример ввода:

+-----------------------------------+------+------+
| value                             |  id  | item |
+-----------------------------------+------+------+
|[[e1, 0.4] , [e2, 0.3]]            | 1    | e3   |
|[[e1, 0.4] , [e2, 0.3], [e3, 0.2]] | 2    | e4   |
|[[e1, 0.4] , [e2, 0.3]]            | 3    | e1   |
|[[e1, 0.4] , [e2, 0.3]]            | 4    | null |
+-----------------------------------+------+------+

Пример вывода:

+------------------------------------------------+------+------+
| value                                          |  id  | item |
+------------------------------------------------+------+------+
|[[e1, 0.4] , [e2, 0.3], [e3, 0.3]]              | 1    | e3   |
|[[e1, 0.4] , [e2, 0.3], [e3, 0.2], [e4, 0.2]]   | 2    | e4   |
|[[e1, 0.4] , [e2, 0.3]]                         | 3    | e1   |
|[[e1, 0.4] , [e2, 0.3]]                         | 4    | null |
+------------------------------------------------+------+------+

Как изменится решение, если я захочу добавить новый (ключ, счет) в определенную позицию в списке? (например, начало или середина)

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
111
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете определить функцию udf для ее достижения.

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

def contains(values,item):
    if not item:
        return values
    keys = [pair['key'] for pair in values]
    if item not in keys:
        scores = [pair['score'] for pair in values]
        values.append({'key':item,'score':min(scores)})
    return values

contains_udf = F.udf(contains,ArrayType(StructType([StructField('key', StringType()),
                                                    StructField('score', DoubleType())])))
df = df.withColumn("value", contains_udf('value','item'))
df.show(truncate = False)

+--------------------------------------------+---+----+
|value                                       |id |item|
+--------------------------------------------+---+----+
|[[e1, 0.4], [e2, 0.3], [e3, 0.3]]           |1  |e3  |
|[[e1, 0.4], [e2, 0.3], [e3, 0.2], [e4, 0.2]]|2  |e4  |
|[[e1, 0.4], [e2, 0.3]]                      |3  |e1  |
|[[e1, 0.4], [e2, 0.3]]                      |4  |null|
+--------------------------------------------+---+----+

Другие вопросы по теме