从列表中创建单行DataFrame(PySpark)

6

我有这样的数据:data = [[1.1, 1.2], [1.3, 1.4], [1.5, 1.6]],我想要创建一个PySpark数据框。

我已经使用了:

dataframe = SQLContext.createDataFrame(data, ['features'])

但我总是得到 <\p>
+--------+---+
|features| _2|
+--------+---+
|     1.1|1.2|
|     1.3|1.4|
|     1.5|1.6|
+--------+---+

我该如何获得类似下面的结果?
+----------+
|features  |
+----------+
|[1.1, 1.2]|
|[1.3, 1.4]|
|[1.5, 1.6]|
+----------+

您可以在创建数据框时创建模式并提供。 - koiralo
3个回答

2

我发现将createDataFrame()方法的参数视为一个包含元组列表的列表是很有用的,其中列表中每个条目对应于 DataFrame 中的一行,而元组的每个元素则对应列。

您可以通过将列表中的每个元素都变成元组来获得所需的输出:

data = [([1.1, 1.2],), ([1.3, 1.4],), ([1.5, 1.6],)]
dataframe = sqlCtx.createDataFrame(data, ['features'])
dataframe.show()
#+----------+
#|  features|
#+----------+
#|[1.1, 1.2]|
#|[1.3, 1.4]|
#|[1.5, 1.6]|
#+----------+

如果更改源代码很麻烦,你也可以采用等效的方式:

data = [[1.1, 1.2], [1.3, 1.4], [1.5, 1.6]]
dataframe = sqlCtx.createDataFrame(map(lambda x: (x, ), data), ['features'])
dataframe.show()
#+----------+
#|  features|
#+----------+
#|[1.1, 1.2]|
#|[1.3, 1.4]|
#|[1.5, 1.6]|
#+----------+

0
你需要一个 map 函数将 tuples 转换为 array 并在 createDataFrame 中使用它。
dataframe = sqlContext.createDataFrame(sc.parallelize(data).map(lambda x: [x]), ['features'])

你应该得到你想要的

+----------+
|  features|
+----------+
|[1.1, 1.2]|
|[1.3, 1.4]|
|[1.5, 1.6]|
+----------+

0

你应该使用向量组装器函数,从你的代码中我猜测你是在训练一个机器学习模型,而向量组装器对于这种情况效果最好。你也可以将组装器添加到管道中。

assemble_feature=VectorAssembler(inputCol=data.columns,outputCol='features')
pipeline=Pipeline(stages=[assemble_feature])
pipeline.fit(data).transform(data)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接