首页 > 解决方案 > 如何在pyspark中为中值、均值和标准创建新列?

问题描述

我有一个 pyspark 数据框,如下所示:

+-----------+------------+
|       date|       count|
+-----------+------------+
| 2017-12-16|           2|
| 2017-12-16|           2|
| 2017-12-17|           2|
| 2017-12-17|           2|
| 2017-12-18|           1|
| 2017-12-19|           4|
| 2017-12-19|           4|
| 2017-12-19|           4|
| 2017-12-19|           4|
| 2017-12-20|           1|
+-----------+------------+

我想为 column 的中值、均值和标准差创建新列count。预期结果:

+-----------+-----------------+------+---+
|       date|       count|mean|median|std|
+-----------+------------+----+------+---+
| 2017-12-16|           2| 2.6|     2|1.2|
| 2017-12-16|           2| 2.6|     2|1.2|
| 2017-12-17|           2| 2.6|     2|1.2|
| 2017-12-17|           2| 2.6|     2|1.2|
| 2017-12-18|           1| 2.6|     2|1.2|
| 2017-12-19|           4| 2.6|     2|1.2|
| 2017-12-19|           4| 2.6|     2|1.2|
| 2017-12-19|           4| 2.6|     2|1.2|
| 2017-12-19|           4| 2.6|     2|1.2|
| 2017-12-20|           1| 2.6|     2|1.2|
+-----------+------------+----+------+---+

标签: pythonapache-sparkpysparkstatistics

解决方案


让我们尝试使用窗口函数:

import pyspark.sql.functions as F
from pyspark.sql.functions import *

k=Window.partitionBy().orderBy().rowsBetween(-sys.maxsize, sys.maxsize)#bounds you to column
md = F.expr('percentile_approx(count, 0.5)')#median expression
mx=F.expr('percentile(count, (0.5))')#median expression

df.withColumn("mean", F.avg('count').over(k)).withColumn("std", F.stddev(col('count')).over(k)).withColumn("median", mx.over(k)).show()

+----------+-----+------------------+------------------+------+
|      date|count|              mean|               std|median|
+----------+-----+------------------+------------------+------+
|2017-12-16|    2|2.6666666666666665|1.3228756555322951|   2.0|
|2017-12-16|    2|2.6666666666666665|1.3228756555322951|   2.0|
|2017-12-17|    2|2.6666666666666665|1.3228756555322951|   2.0|
|2017-12-18|    1|2.6666666666666665|1.3228756555322951|   2.0|
|2017-12-19|    4|2.6666666666666665|1.3228756555322951|   2.0|
|2017-12-19|    4|2.6666666666666665|1.3228756555322951|   2.0|
|2017-12-19|    4|2.6666666666666665|1.3228756555322951|   2.0|
|2017-12-19|    4|2.6666666666666665|1.3228756555322951|   2.0|
|2017-12-20|    1|2.6666666666666665|1.3228756555322951|   2.0|
+----------+-----+------------------+------------------+------+

推荐阅读