在缺少列值时将列值添加到另一列中的数组

2024-04-20 06:55:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个dataframe,其中一列包含一个arraylist,其中包含形式(key,score)的结构,即下面的value列。 另外,我还有一个名为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)

当项不为null时,我想搜索arraylist以查看该项是否存在于value.key键(s) 是的。如果不存在,则将(item,min)追加到arraylist in value列。这里,min是arraylist中分数的最小值。 我需要保留arraylist中元素的顺序,并将新结构附加到列表的末尾。你知道吗

样本输入:

+-----------------------------------+------+------+
| 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 |
+------------------------------------------------+------+------+

如果我想在列表中的特定位置添加新的(键、分数),解决方案会有什么不同?(例如开始或中间)


Tags: keyidtruestringvalueitem结构null
1条回答
网友
1楼 · 发布于 2024-04-20 06:55:45

您可以定义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|
+                      + -+  +

相关问题 更多 >