【问题标题】:Creating cumulative List by grouping in descending order in a DataFrame通过在 DataFrame 中按降序分组创建累积列表
【发布时间】:2019-04-12 20:38:26
【问题描述】:

我是 python 编程的新手,我需要添加一列作为值列表。我必须在 pySpark 中执行此操作,并且不能为此使用 pandas。

数据框如下所示

Name    yr  cash
a   1   100
a   2   200
a   3   300
a   4   400
a   5   500
a   6   600
b   1   23
b   2   32
b   3   34
b   4   55
b   5   43

我需要输出如下:

Name    yr  cash    cash_list
a   1   100 100,200,300,400,500,600
a   2   200 200,300,400,500,600
a   3   300 300,400,500,600
a   4   400 400,500,600
a   5   500 500,600
a   6   600 600
b   1   23  23,32,34,55,43
b   2   32  32,34,55,43
b   3   34  34,55,43
b   4   55  55,43
b   5   43  43

如果您能提供任何有关如何执行此操作的见解,我将不胜感激!

【问题讨论】:

    标签: python-3.x pyspark


    【解决方案1】:

    主要思想是将collect_list()Nameyr的降序累加。 collect_list() 将为您提供列中的值数组。

    # Creating the DataFrame
    df = sc.parallelize([('a',1,100),('a',2,200),('a',3,300),('a',4,400),('a',5,500),('a',6,600),('b',1,23),('b',2,32),('b',3,34),('b',4,55),('b',5,43)]).toDF(['Name','yr','cash'])
    df.show()
    +----+---+----+ 
    |Name| yr|cash| 
    +----+---+----+ 
    |   a|  1| 100| 
    |   a|  2| 200| 
    |   a|  3| 300| 
    |   a|  4| 400| 
    |   a|  5| 500| 
    |   a|  6| 600| 
    |   b|  1|  23| 
    |   b|  2|  32| 
    |   b|  3|  34| 
    |   b|  4|  55| 
    |   b|  5|  43| 
    +----+---+----+
    

    df创建后,您可以使用Window函数对列表进行累积聚合。

    # Loading the requisite packages
    from pyspark.sql import Window
    from pyspark.sql.functions import col, collect_list
    w = (Window.partitionBy('Name').orderBy(col('yr').desc()).rangeBetween(Window.unboundedPreceding, 0))
    df = df.withColumn('cash_list', collect_list('cash').over(w))    
    df.show(truncate=False)
    +----+---+----+------------------------------+ 
    |Name|yr |cash|cash_list                     | 
    +----+---+----+------------------------------+ 
    |b   |5  |43  |[43]                          | 
    |b   |4  |55  |[43, 55]                      | 
    |b   |3  |34  |[43, 55, 34]                  | 
    |b   |2  |32  |[43, 55, 34, 32]              | 
    |b   |1  |23  |[43, 55, 34, 32, 23]          | 
    |a   |6  |600 |[600]                         | 
    |a   |5  |500 |[600, 500]                    | 
    |a   |4  |400 |[600, 500, 400]               | 
    |a   |3  |300 |[600, 500, 400, 300]          | 
    |a   |2  |200 |[600, 500, 400, 300, 200]     | 
    |a   |1  |100 |[600, 500, 400, 300, 200, 100]|    
    +----+---+----+------------------------------+
    

    【讨论】:

      猜你喜欢
      • 2022-06-15
      • 2022-08-18
      • 1970-01-01
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      • 2011-11-29
      相关资源
      最近更新 更多