0

I have data like below, want to take data for same id from one column and put each answer in different new columns respectively

actual         

ID  Brandid  
1   234      
1   122      
1   134      
2   122
3   234
3   122


Excpected

ID BRANDID_1  BRANDID_2  BRANDID_3
1     234       122         134
2     122        -           -
3     234       122          - 
Shantanu Sharma
  • 3,661
  • 1
  • 18
  • 39

1 Answers1

0

You can use pivot after a groupBy, but first you can create a column with the future column name using row_number to get monotically number per ID over a Window. Here is one way:

import pyspark.sql.functions as F
from pyspark.sql.window import Window

# create the window on ID and as you need orderBy after, 
# you can use a constant to keep the original order do F.lit(1)
w = Window.partitionBy('ID').orderBy(F.lit(1)) 

#           create the column with future columns name to pivot on
pv_df = (df.withColumn('pv', F.concat(F.lit('Brandid_'), F.row_number().over(w).cast('string'))) 
#           groupby the ID and pivot on the created column
           .groupBy('ID').pivot('pv')
#          in aggregation, you need a function so we use first
           .agg(F.first('Brandid')))

and you get

pv_df.show()
+---+---------+---------+---------+
| ID|Brandid_1|Brandid_2|Brandid_3|
+---+---------+---------+---------+
|  1|      234|      122|      134|
|  3|      234|      122|     null|
|  2|      122|     null|     null|
+---+---------+---------+---------+

EDIT: to get the column in order as OP requested, you can use lpad, first define the length for number you want:

nb_pad = 3

and replace in the above method F.concat(F.lit('Brandid_'), F.row_number().over(w).cast('string')) by

F.concat(F.lit('Brandid_'), F.lpad(F.row_number().over(w).cast('string'), nb_pad, "0"))

and if you don't know how many "0" you need to add (here it was number of length of 3 overall), then you can get this value by

nb_val = len(str(sdf.groupBy('ID').count().select(F.max('count')).collect()[0][0]))
Ben.T
  • 29,160
  • 6
  • 32
  • 54