gpt4 book ai didi

python - 如何找到 pyspark 数据框中每个列表的第一个值的中位数?

转载 作者:行者123 更新时间:2023-12-01 08:17:49 24 4
gpt4 key购买 nike

values = [(u'[23,4,77,890,455]',10),(u'[11,2,50,1,11]',20),(u'[10,5,1,22,04]',30)]
df = sqlContext.createDataFrame(values,['list','A'])
df.show()

+-----------------+---+
| list_1| A|
+-----------------+---+
|[23,4,77,890,455]| 10|
| [11,2,50,1,11]| 20|
| [10,5,1,22,04]| 30|
+-----------------+---+

我想将上面的 Spark 数据帧转换为一个框架,使得“list_1”列的每个列表中的第一个元素应该在一列中,即第一列中的 23,11,10 第二列中的 4,2,5 等。我试过了

df.select([df.list_1[i] for i in range(5)])

但是由于每个列表中有大约 4000 个值,上述操作似乎很耗时。最终目标是找到结果数据帧中每列的中位数。

我使用 pyspark。

最佳答案

您可以查看posexplode。我使用了您的小示例,并将数据帧转换为另一个数据帧,其中包含 5 列以及每行数组中的相应值。

from pyspark.sql.functions import *
df1 = spark.createDataFrame([([23,4,77,890,455],10),([11,2,50,1,11],20),\
([10,5,1,22,04],30)], ["list1","A"])
df1.select(posexplode("list1"),"list1","A")\ #explodes the array and creates multiple rows for each element with the position in the columns "col" and "pos"
.groupBy("list1","A").pivot("pos")\ #group by your initial values and take the "pos" column as pivot to create 1 new column per element here
.agg(max("col")).show(truncate=False) #collect the values

输出:

+---------------------+---+---+---+---+---+---+
|list1 |A |0 |1 |2 |3 |4 |
+---------------------+---+---+---+---+---+---+
|[10, 5, 1, 22, 4] |30 |10 |5 |1 |22 |4 |
|[11, 2, 50, 1, 11] |20 |11 |2 |50 |1 |11 |
|[23, 4, 77, 890, 455]|10 |23 |4 |77 |890|455|
+---------------------+---+---+---+---+---+---+

当然,之后您可以继续计算各个数组值的平均值或任何您想要的值。

如果您的 list1 列包含字符串而不是直接数组,您需要首先提取数组。您可以使用 regexp_extract 和 split 来完成此操作。它也适用于字符串中的浮点值。

df1 = spark.createDataFrame([(u'[23.1,4,77,890,455]',10),(u'[11,2,50,1.1,11]',20),(u'[10,5,1,22,04.1]',30)], ["list1","A"])
df1 = df1.withColumn("list2",split(regexp_extract("list1","(([\d\.]+,)+[\d\.]+)",1),","))
df1.select(posexplode("list2"),"list1","A").groupBy("list1","A").pivot("pos").agg(max("col")).show(truncate=False)

关于python - 如何找到 pyspark 数据框中每个列表的第一个值的中位数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54883268/

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