通过在DataFrame中按降序分组来创建累积列表

时间:2019-04-12 10:47:28

标签: python-3.x pyspark

我是python编程的新手,我需要添加一列作为值列表。我必须在pySpark中这样做,并且不能为此使用熊猫。

数据框看起来像这样

index <- c(1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3)
prob <- runif(20,0,1)

x.df <- data.frame(cbind(index,prob))
x.df <- x.df[order(x.df$index,-x.df$prob),]

head(x.df[x.df$index==1,],n=3)
head(x.df[x.df$index==2,],n=3)
head(x.df[x.df$index==3,],n=3)

我需要如下输出:

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

我将对如何执行此操作有任何见解!

1 个答案:

答案 0 :(得分:1)

主要思想是按Nameyr的降序累积使用collect_list()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]|    
+----+---+----+------------------------------+