如何解决如何在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 举报,一经查实,本站将立刻删除。