【问题标题】:how to create new column for median, mean and std in pyspark?如何在pyspark中为中值、均值和标准创建新列?
【发布时间】:2021-07-27 04:14:07
【问题描述】:

我有一个 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|
+-----------+------------+----+------+---+

【问题讨论】:

    标签: python apache-spark pyspark statistics


    【解决方案1】:

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

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

    【讨论】:

    • 嗨@wwnde 谢谢你看一下它。我有一个后续问题。在某些情况下,标准差会导致NaN。你能帮忙吗?
    • 可能这里只有一行,在计算标准偏差时,除以 N-1 得到 0。有没有办法用唯一/最后一个值替换 NaN?
    猜你喜欢
    • 2020-10-19
    • 1970-01-01
    • 2018-06-08
    • 2019-12-14
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    相关资源
    最近更新 更多