如何在pyspark中找到列中列表的平均值?

cnwbcb6i  于 2021-07-14  发布在  Spark
关注(0)|答案(2)|浏览(531)

我有如下的Dataframe。我希望能够找到一个平均值,并放入一个新的\u列。我可以找到平均使用自定义项,但不能把它列。如果你能在没有自定义项的情况下提供帮助,那就太好了。否则,欢迎对当前解决方案提供任何帮助。

from pyspark.sql.types import StructType,StructField 
from pyspark.sql.types import StringType, IntegerType, ArrayType
data = [
("Smith","[55, 65, 75]"),
("Anna","[33, 44, 55]"),
("Williams","[9.5, 4.5, 9.7]"),    
]

schema = StructType([
StructField('name', StringType(), True),
StructField('some_value', StringType(), True)
])

df = spark.createDataFrame(data = data, schema= schema)
df.show(truncate=False)

+--------+---------------+
|name    |some_value     |
+--------+---------------+
|Smith   |[55, 65, 75]   |
|Anna    |[33, 44, 55]   |
|Williams|[9.5, 4.5, 9.7]|
+--------+---------------+

解决办法是这样的,

array_mean = F.udf(lambda x: float(np.mean(x)), FloatType())

(从pyspark数组的find mean)返回一个Dataframe,而不是一个新列。
欢迎任何帮助。谢谢您。

vvppvyoh

vvppvyoh1#

您有一个看起来像数组的字符串列,而不是数组列,因此还需要转换udf中的数据类型:

import json
import numpy as np
import pyspark.sql.functions as F

array_mean = F.udf(lambda x: float(np.mean(json.loads(x))), 'float')
df2 = df.withColumn('mean_value', array_mean('some_value'))

df2.show()
+--------+---------------+----------+
|    name|     some_value|mean_value|
+--------+---------------+----------+
|   Smith|   [55, 65, 75]|      65.0|
|    Anna|   [33, 44, 55]|      44.0|
|Williams|[9.5, 4.5, 9.7]|       7.9|
+--------+---------------+----------+
qq24tv8q

qq24tv8q2#

从pandasand newbie到Pypark,我走了很长的路。
条带[]
拆分为列表
爆炸
意思是

df2 = df.select(df.name,F.regexp_replace('some_value', '[\\]\\[]', "").alias("some_value")).select(df.name, F.split("some_value",",").alias("some_value")).select(df.name, F.explode("some_value").alias("some_value"))
 df2 = df2.withColumn("some_value", df2.some_value.cast('float')).groupBy("name").mean( "some_value")

相关问题