使用Pyspark根据多个值在数据框中生成n列

阿比舍克·维伊(Abhishek Vij)

我已经从表中创建了这样的数据框

df = spark.sql("select * from test")  # it is having 2 columns id and name
df2 = df.groupby('id').agg(collect_list('name')
df2.show()
|id|name|
|44038:4572|[0032477212299451]|
|44038:5439|[00324772, 0032477, 003247, 00324]|
|44038:4429|[0032477212299308]|

直到这里是正确的,对于一个ID我可以存储多个名称(值)。现在,当我尝试根据值在datafarme中创建动态列时,它不起作用。

df3 = df2.select([df2.id] + [df2.name[i] for i in range (length)])

输出为:

|id |name[0]|
|44038:4572|0032477212299451|
|44038:5439|00324772|
|44038:4429|032477212299308|

datafarme中的预期输出:

|id|name[0]|name[1]|name[2]|name[3]|
|44038:4572|0032477212299451|null|null|null|
|44038:5439|00324772|0032477|003247|0034|
|44038:4429|032477212299308|null|null|null|

然后必须替换null0

在此方面的帮助,将非常感谢。

麦克

你可能会关闭做的更好pivot,而不是collect_list

from pyspark.sql import functions as F, Window

df2 = (df.withColumn('rn', F.row_number().over(Window.partitionBy('id').orderBy(F.desc('name'))))
         .groupBy('id')
         .pivot('rn')
         .agg(F.first('name'))
         .fillna("0")
      )

df2.show()
+----------+----------------+-------+------+-----+
|        id|               1|      2|     3|    4|
+----------+----------------+-------+------+-----+
|44038:4572|0032477212299451|      0|     0|    0|
|44038:5439|        00324772|0032477|003247|00324|
|44038:4429|0032477212299308|      0|     0|    0|
+----------+----------------+-------+------+-----+

如果您想要漂亮的列名,可以

df3 = df2.toDF('id', *[f'name{i}' for i in range(len(df2.columns) - 1)])
df3.show()
+----------+----------------+-------+------+-----+
|        id|           name0|  name1| name2|name3|
+----------+----------------+-------+------+-----+
|44038:4572|0032477212299451|      0|     0|    0|
|44038:5439|        00324772|0032477|003247|00324|
|44038:4429|0032477212299308|      0|     0|    0|
+----------+----------------+-------+------+-----+

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用唯一的列值对在数据框中生成二元标识符

pyspark在数据框中使用null替换多个值

根据嵌套组中的组事件在数据框中生成新列

如何使用“for-loop”和列添加在数据框中生成列?

如何使用Pandas在数据框中生成缺失的增量行值?

在数据框中生成日期列

基于组事件在数据框中生成新列

根据列的多个值在数据框中创建新行

通过基于R?中的分位数来分配值,从而在数据框中生成新列。

在数据框中生成7列的所有组合,并添加相应的行以生成新列

如何使用PySpark在数据框中删除基于多个过滤器的列?

使用python pandas在数据框中使用多个字典重新映射多个列值

在数据面板中生成列模式

根据其值计数在数据框中删除列

在数据框中生成带有条件值的行

在数据框中生成新列,按组计数重复项

在数据框中的多个列中检查相同的值

使用pyspark在数据框中动态填充空列

根据列值对pyspark数据框进行排序

在pyspark数据框中生成序列,以便在null后找到值时递增

如何根据数据框 B 中的多个条件在数据框 A 中创建新列

Scala:在数据框中生成日期

如何在数据框中生成缺失行

根据多个列中的值创建新的数据框列

在 pyspark 的数据框中生成 6 位随机数作为新列

使用多个条件在数据框中创建列

如何根据数据中多个分隔符的值在数据框中创建组?

基于跨多个列应用函数,在R数据框中生成新列

在pyspark数据帧的新列中生成列值总和和行总和的矩阵