【问题标题】:Calculate percentile with Groupby on pyspark dataframe在 pyspark 数据帧上使用 Groupby 计算百分位数
【发布时间】:2019-05-16 01:51:03
【问题描述】:

我正在尝试分组,然后在 pyspark 数据帧上计算百分位数。我根据以下代码测试了 到这个stackoverflow post:

from pyspark.sql.types import FloatType
import pyspark.sql.functions as func
import numpy as np

qt_udf = func.udf(lambda x,qt: float(np.percentile(x,qt)), FloatType())
df_out = df_in.groupBy('Id').agg(func.collect_list('value').alias('data'))\
.withColumn('median', qt_udf(func.col('data'),func.lit(0.5)).cast("string"))  

df_out.show()

但得到以下错误:

Traceback(最近一次调用最后一次):> df_out.show() ....> return lambda *a: f(*a) AttributeError: 'module' object has no attribute 'percentile'

这是因为 numpy 版本(1.4.1),百分位函数是从 1.5 版本开始添加的。短期内无法更新numpy版本。

【问题讨论】:

标签: python apache-spark pyspark apache-spark-sql


【解决方案1】:

定义一个窗口并使用内置的percent_rank 函数来计算百分位值。

from pyspark.sql import Window
from pyspark.sql import functions as func
w = Window.partitionBy(df_in.Id).orderBy(df_in.value) #assuming default ascending order
df_out = df_in.withColumn('percentile_col',func.percent_rank().over(w))

【讨论】:

  • 你能展示如何使用实数计算中位数吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 2021-02-20
  • 2017-01-07
  • 2022-12-13
  • 1970-01-01
  • 2017-09-04
  • 2015-02-25
相关资源
最近更新 更多