Создание совокупного списка путем группировки в порядке убывания в фрейме данных

#python-3.x #pyspark

#python-3.x #pyspark

Вопрос:

Я новичок в программировании на 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
  

Я был бы признателен за любую информацию о том, как это сделать!

Ответ №1:

Основная идея заключается в использовании collect_list() в порядке убывания по Name и yr кумулятивно. 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]|    
 ---- --- ---- ------------------------------