PYSPARK :查找不包括前 1 个百分位数据的变量的平均值
Posted
技术标签:
【中文标题】PYSPARK :查找不包括前 1 个百分位数据的变量的平均值【英文标题】:PYSPARK : Finding a Mean of a variables excluding the top 1 percentile of data 【发布时间】:2020-07-22 22:48:51 【问题描述】:我有一个数据集,该数据集由多个变量分组,我们在其中找到诸如 mean 、 std dev 等聚合。现在我想找到不包括前 1 个百分位数数据的变量的均值
我正在尝试类似的东西
df_final=df.groupby(groupbyElement).agg(mean('value').alias('Mean'),stddev('value').alias('Stddev'),expr('percentile(value, array(0.99))')[0].alias('99_percentile'),mean(when(col('value')<=col('99_percentile'),col('value')))
但似乎 spark 不能使用在同一组语句中定义的 agg 名称。
我什至试过这个,
~df_final=df.groupby(groupbyElement).agg(mean('value').alias('Mean'),stddev('value').alias('Stddev'),mean(when(col(' value')
但它会引发以下错误: pyspark.sql.utils.AnalysisException:'不允许在另一个聚合函数的参数中使用聚合函数。请在子查询中使用内部聚合函数。
希望有人能回答这个问题
更新: 我尝试做其他方式
【问题讨论】:
不确定这是否可以一次性完成。当您尝试对其进行过滤时,不会创建您的“99_percentile”。 【参考方案1】:这是对您的代码的简单修改。它将聚合 df 两次。据我所知,这是必需的。
df_final=(
df.join(df
.groupby(groupbyElement)
.agg(expr('percentile(value, array(0.99))')[0].alias('99_percentile'),
on=["groupbyElement"], how="left"
)
.groupby(groupbyElement)
.agg(mean('value').alias('Mean'),
stddev('value').alias('Stddev'),
mean(when(col('value')<=col('99_percentile'), col('value')))
)
【讨论】:
谢谢贾斯汀。这看起来很棒。让我运行这个,我会在一分钟内接受答案。以上是关于PYSPARK :查找不包括前 1 个百分位数据的变量的平均值的主要内容,如果未能解决你的问题,请参考以下文章