如何在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的列中找到列表的平均值?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算另一列中特定值的列的平均值?

如何自动化文件路径以从多个 csv 文件的列中获取平均值?

ArrayType Pyspark 列中唯一元素行的平均值

如何在 PySpark 中找到数组数组的平均值

Pyspark:添加具有 groupby 平均值的列

如何在 PySpark 中的 RDD 中的列中查找标准差