感兴趣的是在同一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)])
但它没有显示如何使用提供的列名列表,因为列名只是列的索引。
实际上没那么复杂。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|
+---------------+---+-----+---+
当然,您也可以内联它。
我提出了一个基于某些假设的解决方案。
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解决方案。我已经尝试过,但是我不确定这是我要找的东西。谢谢! 问题答案: 我目前想出的唯一解决方案是实现自己的自定义收集器。 在阅读解决方案之前,我想添加一些有关此的注释。我将这个问题更多地当作编程练习,我不确定是否可以使用并行流来完成。 因此,您必须意识