首页 > 解决方案 > PYSPARK:查找不包括前 1 个百分位数据的变量的平均值

问题描述

我有一个数据集,该数据集由多个变量分组,我们在其中找到诸如 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') <=expr('percentile(value, array(0.99))')[0],col('value')))~

但它会引发以下错误:pyspark.sql.utils.AnalysisException:'不允许在另一个聚合函数的参数中使用聚合函数。请在子查询中使用内部聚合函数。

我希望有人能够回答这个问题

更新:我尝试做其他方式

标签: pysparkapache-spark-sqldata-science

解决方案


这是对您的代码的直接修改。它将聚合 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')))
          )

推荐阅读