python - 计算pyspark中列的中位数
问题描述
我有一个数据框,如下所示:
+-----------+------------+
|parsed_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|
+-----------+------------+
我想计算整个“计数”列的中位数并将结果添加到新列中。
我试过了:
median = df.approxQuantile('count',[0.5],0.1).alias('count_median')
但是我当然做错了,因为它给出了以下错误:
AttributeError: 'list' object has no attribute 'alias'
请帮忙。
解决方案
您需要添加一列,withColumn
因为approxQuantile
返回浮点列表,而不是 Spark 列。
import pyspark.sql.functions as F
df2 = df.withColumn('count_media', F.lit(df.approxQuantile('count',[0.5],0.1)[0]))
df2.show()
+-----------+-----+-----------+
|parsed_date|count|count_media|
+-----------+-----+-----------+
| 2017-12-16| 2| 2.0|
| 2017-12-16| 2| 2.0|
| 2017-12-17| 2| 2.0|
| 2017-12-17| 2| 2.0|
| 2017-12-18| 1| 2.0|
| 2017-12-19| 4| 2.0|
| 2017-12-19| 4| 2.0|
| 2017-12-19| 4| 2.0|
| 2017-12-19| 4| 2.0|
| 2017-12-20| 1| 2.0|
+-----------+-----+-----------+
您还可以在 Spark SQL 中使用approx_percentile
/函数:percentile_approx
import pyspark.sql.functions as F
df2 = df.withColumn('count_media', F.expr("approx_percentile(count, 0.5, 10) over ()"))
df2.show()
+-----------+-----+-----------+
|parsed_date|count|count_media|
+-----------+-----+-----------+
| 2017-12-16| 2| 2|
| 2017-12-16| 2| 2|
| 2017-12-17| 2| 2|
| 2017-12-17| 2| 2|
| 2017-12-18| 1| 2|
| 2017-12-19| 4| 2|
| 2017-12-19| 4| 2|
| 2017-12-19| 4| 2|
| 2017-12-19| 4| 2|
| 2017-12-20| 1| 2|
+-----------+-----+-----------+
推荐阅读
- qml - GridView中委托的访问功能
- maven - 如何为 install4j-maven-plugin 配置代理设置?
- php - 编码 utf8 有时不起作用 php 脚本集成
- sql - 在 PostgreSQL 中将列数据转换为行
- jenkins-pipeline - artifactory - 获取依赖信息
- c++ - 使自定义范围 v3 视图可管道化
- c# - 在 MapControl 上移动图像 - uwp c#
- ios - 如何在 Carto Mobile Swift 中使用固定标记引脚在背景中移动地图
- go - 如何有效地停止 gocron 作业?
- angularjs - $interval.cancel 不破坏 http.get 中的计时器