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 个百分位数据的变量的平均值的主要内容,如果未能解决你的问题,请参考以下文章

查找名为 mag(地震震级)的列的百分位数

第99个百分位与箱图中的晶须= 99不匹配

Pyspark:查找两个数据框的交集仅返回一列具有值

用于有效百分位查找的数据结构?

Pyspark 在查找前一行时按组迭代数据帧

15、pandas的设置数字格式,小数位数、百分号、千位分隔符