我是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
我将对如何执行此操作有任何见解!
答案 0 :(得分:1)
主要思想是按Name
和yr
的降序累积使用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]|
+----+---+----+------------------------------+