如何在pyspark的列中找到列表的平均值?
Posted
技术标签:
【中文标题】如何在pyspark的列中找到列表的平均值?【英文标题】:How to find average of list in a column in pyspark? 【发布时间】:2021-07-11 09:41:32 【问题描述】:我有如下所示的数据框。我希望能够找到一个平均值并放入一个 new_column。我可以使用 udf 找到 avg,但不能将其放在列中。如果您可以在没有 udf 的情况下提供帮助,那就太好了。否则,欢迎对当前解决方案提供任何帮助。
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())
(来自Find mean of pyspark array<double>)返回一个数据框而不是一个新列。
欢迎任何帮助。谢谢。
【问题讨论】:
【参考方案1】:您有一个看起来像数组的字符串列,而不是数组列,因此您还需要转换 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|
+--------+---------------+----------+
【讨论】:
【参考方案2】:从 Pandas 和新手到 pyspark,我走了很长一段路。
剥离[]
拆分成列表
爆炸
意思
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")
【讨论】:
以上是关于如何在pyspark的列中找到列表的平均值?的主要内容,如果未能解决你的问题,请参考以下文章