当前位置: 首页 > 知识库问答 >
问题:

将列表的spark DF列拆分为单个列

关飞翼
2023-03-14

感兴趣的是在同一pyspark数据帧中将列表的这一列拆分为多列的scala-spark实现

给定该数据帧:

|              X     |            Y|
+--------------------+-------------+
|                rent|[1,2,3......]|
|     is_rent_changed|[4,5,6......]|
|               phone|[7,8,9......]|

我想要一个新的数据帧,它包含分解值并映射到我提供的列名称:

colNames = ['cat','dog','mouse'....]

|              Column|cat |dog |mouse |.......|
+--------------------+---|---|--------|-------|
|                rent|1  |2  |3       |.......|
|     is_rent_changed|4  |5  |6       |.......|
|               phone|7  |8  |9       |.......|

尝试:

val out = df.select(col("X"),explode($"Y"))

但它的格式错误,我不知道如何映射到我的 colNames 列表:

X              | Y |
---------------|---|
rent           |1  |
rent           |2  |
rent           |3  |
.              |.  |
.              |.  |
is_rent_changed|4  |
is_rent_changed|5  |

在上面的链接中,python的解决方案是使用列表理解:

univar_df10.select([univar_df10.Column] + [univar_df10.Quantile[i] for i in range(length)])

但它没有显示如何使用提供的列名列表,因为列名只是列的索引

共有2个答案

越学义
2023-03-14

实际上没那么复杂。dataframe的< code>select所期望的只是< code>Column对象的列表,我们可以通过编程方式创建该列表:

val columns = List("cat", "mouse", "dog")
   .zipWithIndex
   .map{ case (header, idx) => $"y"(idx).alias(header) }

那么我们只需要在select中使用它:

val df = List(("rent", Array(1,2,3)), ("is_rent_changed", Array(3,4,5))).toDF("x", "y")
df.select($"x" :: columns : _*).show()

输出:

+---------------+---+-----+---+
|              x|cat|mouse|dog|
+---------------+---+-----+---+
|           rent|  1|    2|  3|
|is_rent_changed|  3|    4|  5|
+---------------+---+-----+---+

当然,您也可以内联它。

长孙嘉
2023-03-14

我提出了一个基于某些假设的解决方案。

var df1 = df

其中< code>df是您的输入df。例如:-

+---+---------+
| id|    value|
+---+---------+
|  1|[A, B, C]|
|  2|[D, E, F]|
+---+---------+

val columns = Array("cat","dog","sheep")

列是名的数组。

for(i<-1 to columns.length)
df1 = df1.withColumn(columns(i-1),'value.getItem(i-1))


+---+---------+---+---+-----+
| id|    value|cat|dog|sheep|
+---+---------+---+---+-----+
|  1|[A, B, C]|  A|  B|    C|
|  2|[D, E, F]|  D|  E|    F|
+---+---------+---+---+-----+

如果需要,现在可以删除值列。希望这对你有用!

 类似资料:
  • 如何将这列列表拆分为两列? 期望的结果:

  • 问题内容: 我将数据保存在postgreSQL数据库中。我正在使用Python2.7查询此数据并将其转换为Pandas DataFrame。但是,此数据框的最后一列中包含值的字典(或列表?)。DataFrame看起来像这样: 我需要将此列拆分为单独的列,以便DataFrame如下所示: 我遇到的主要问题是列表的长度不同。但是所有列表最多只能包含相同的3个值:a,b和c。而且它们始终以相同的顺序出现

  • 我有一个非常简单的,其中每个单元格都包含一个列表。我想将列表中的每个元素拆分为它自己的列。我可以通过导出值,然后创建一个新的

  • 我在presto上有一个表,它有多个记录的记录。在该记录中,我使用了这个简单的SQL查询,

  • 问题内容: 这个问题类似于将 列表切成子列表的列表 ,但是在我的情况下,我想包括每个先前子列表的最后一个元素,作为下一个子列表的第一个元素。并且必须考虑到最后一个元素必须始终至少包含两个元素。 例如: 大小为3的子列表的结果: 问题答案: 通过简单地缩短传递到范围的“ step”参数,可以轻松地将链接的答案中的列表理解用于支持重叠的块: 这个问题的其他访问者可能没有足够的精力来处理输入 列表 (可

  • 问题内容: 我有这个清单(): 我想要这样的东西: 换句话说,我想使用值作为分隔符将列表拆分为子列表,以获得列表列表()。我正在寻找Java 8解决方案。我已经尝试过,但是我不确定这是我要找的东西。谢谢! 问题答案: 我目前想出的唯一解决方案是实现自己的自定义收集器。 在阅读解决方案之前,我想添加一些有关此的注释。我将这个问题更多地当作编程练习,我不确定是否可以使用并行流来完成。 因此,您必须意识