gpt4 book ai didi

list - 如何在 pyspark 的列表中找到最频繁出现的元素?

转载 作者:行者123 更新时间:2023-12-01 23:13:04 25 4
gpt4 key购买 nike

我有一个包含两列的 pyspark 数据框,ID 和 Elements。 “元素”列中有列表元素。看起来像这样,

ID | Elements
_______________________________________
X |[Element5, Element1, Element5]
Y |[Element Unknown, Element Unknown, Element_Z]

我想用“元素”列中出现频率最高的元素构成一列。输出应该是这样的,

ID | Elements                                           | Output_column 
__________________________________________________________________________
X |[Element5, Element1, Element5] | Element5
Y |[Element Unknown, Element Unknown, Element_Z] | Element Unknown

我如何使用 pyspark 做到这一点?

提前致谢。

最佳答案

我们可以在这里使用高阶函数(可从 spark 2.4+ 获得)

  1. 首先使用transformaggregate 获取数组中每个不同值的计数。
  2. 然后对结构体数组进行降序排序,然后得到第一个元素。

from pyspark.sql import functions as F
temp = (df.withColumn("Dist",F.array_distinct("Elements"))
.withColumn("Counts",F.expr("""transform(Dist,x->
aggregate(Elements,0,(acc,y)-> IF (y=x, acc+1,acc))
)"""))
.withColumn("Map",F.arrays_zip("Dist","Counts")
)).drop("Dist","Counts")
out = temp.withColumn("Output_column",
F.expr("""element_at(array_sort(Map,(first,second)->
CASE WHEN first['Counts']>second['Counts'] THEN -1 ELSE 1 END),1)['Dist']"""))

输出:

请注意,我为 ID z 添加了一个空白数组以进行测试。您也可以通过将 .drop("Map") 添加到输出中来删除 Map

out.show(truncate=False)

+---+---------------------------------------------+--------------------------------------+---------------+
|ID |Elements |Map |Output_column |
+---+---------------------------------------------+--------------------------------------+---------------+
|X |[Element5, Element1, Element5] |[{Element5, 2}, {Element1, 1}] |Element5 |
|Y |[Element Unknown, Element Unknown, Element_Z]|[{Element Unknown, 2}, {Element_Z, 1}]|Element Unknown|
|Z |[] |[] |null |
+---+---------------------------------------------+--------------------------------------+---------------+

对于低版本,你可以使用带统计模式的udf:

from pyspark.sql import functions as F,types as T
from statistics import mode
u = F.udf(lambda x: mode(x) if len(x)>0 else None,T.StringType())

df.withColumn("Output",u("Elements")).show(truncate=False)
+---+---------------------------------------------+---------------+
|ID |Elements |Output |
+---+---------------------------------------------+---------------+
|X |[Element5, Element1, Element5] |Element5 |
|Y |[Element Unknown, Element Unknown, Element_Z]|Element Unknown|
|Z |[] |null |
+---+---------------------------------------------+---------------+

关于list - 如何在 pyspark 的列表中找到最频繁出现的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69483901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com