微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在pyspark中为中值、均值和标准创建新列?

如何解决如何在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|
+-----------+------------+

我想为列 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|
+-----------+------------+----+------+---+

解决方法

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

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|
+----------+-----+------------------+------------------+------+

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。