You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PySpark实现Pandas自定义分位数分组统计的等效功能?

问题

在Pandas中,执行代码x.groupby('y').describe(percentiles=[.1, .25, .5, .75, .9, 1])就能按y分组后获取自定义分位数的分布统计,但PySpark的describe()不支持指定自定义分位数,summary()也只支持0.25、0.50、0.75这几个标准分位数,怎么在PySpark中实现上述Pandas代码的等效功能?

解决方案

可以通过groupBy结合agg方法,搭配PySpark的分位数函数来实现自定义分位数的分组统计,具体实现如下:

步骤说明

  1. 定义需要计算的自定义分位数列表;
  2. 构建包含常规统计量(计数、均值、标准差、最值等)和各分位数的聚合表达式;
  3. 基于分组列执行聚合操作,得到最终统计结果。

代码示例

假设你的PySpark DataFrame名为df,分组列为y,需要统计的数值列为value:

from pyspark.sql import functions as F

# 定义自定义分位数
target_quantiles = [0.1, 0.25, 0.5, 0.75, 0.9, 1.0]

# 初始化聚合表达式,包含describe里的基础统计量
aggregations = [
    F.count('value').alias('count'),
    F.mean('value').alias('mean'),
    F.stddev('value').alias('std'),
    F.min('value').alias('min'),
    F.max('value').alias('max')
]

# 为每个分位数添加对应的聚合计算
for q in target_quantiles:
    # 使用percentile_approx做近似计算,大数据场景性能更优;需精确计算可替换为F.percentile
    aggregations.append(F.percentile_approx('value', q).alias(f'{int(q*100)}%'))

# 执行分组聚合
grouped_stats = df.groupBy('y').agg(*aggregations)

# 查看结果
grouped_stats.show()

关键细节

  • 分位数函数选择:percentile_approx是近似分位数计算,适合大规模数据集,执行效率高;如果业务要求精确分位数,可替换为F.percentile,但该函数在大数据量下性能会显著下降。
  • 列名对齐:用{int(q*100)}%命名分位数列,和Pandasdescribe的输出格式保持一致,便于结果对比。
  • 扩展统计量:如果需要偏度、峰度等额外统计项,直接在aggregations列表中添加F.skewness('value').alias('skew')、F.kurtosis('value').alias('kurtosis')即可。

内容的提问来源于stack exchange,提问作者bernando_vialli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 17:02:42