Python 使用Pyspark将密集向量转换为数据帧
首先,我尝试了下面链接中的所有方法来修复我的错误,但都没有成功 我试图将密集向量转换为数据帧(最好是Spark)以及列名,并遇到问题 spark dataframe中的我的列是一个使用vector Assembler创建的向量,现在我想将它转换回一个dataframe,因为我想在向量中的一些变量上创建绘图 方法1:Python 使用Pyspark将密集向量转换为数据帧,python,pandas,apache-spark,dataframe,Python,Pandas,Apache Spark,Dataframe,首先,我尝试了下面链接中的所有方法来修复我的错误,但都没有成功 我试图将密集向量转换为数据帧(最好是Spark)以及列名,并遇到问题 spark dataframe中的我的列是一个使用vector Assembler创建的向量,现在我想将它转换回一个dataframe,因为我想在向量中的一些变量上创建绘图 方法1: from pyspark.ml.linalg import SparseVector, DenseVector from pyspark.ml.linalg import Vect
from pyspark.ml.linalg import SparseVector, DenseVector
from pyspark.ml.linalg import Vectors
temp=output.select("all_features")
temp.rdd.map(
lambda row: (DenseVector(row[0].toArray()))
).toDF()
下面是错误
TypeError: not supported type: <type 'numpy.ndarray'>
错误:
AttributeError: 'numpy.ndarray' object has no attribute 'asML'
我还尝试将数据帧转换为数据帧,之后我无法将值拆分为单独的列
方法3:
pandas_df=temp.toPandas()
pandas_df1=pd.DataFrame(pandas_df.all_features.values.tolist())
上面的代码运行良好,但我的数据框中仍然只有一列,所有值都以逗号分隔,作为列表
非常感谢您的帮助
编辑:
下面是我的临时数据框的外观。它只有一列所有功能。我正在尝试创建一个数据框架,将所有这些值拆分为单独的列(所有_特性都是使用200列创建的向量)
预期的输出是一个数据帧,在一个数据帧中所有200列被分隔开
+----------------------------+
| col1| col2| col3|...
+----------------------------+
|0.01193689934723|0.0|0.5049431301173817...
|0.04774759738895|0.0|0.1657316216149636...
|0.0|0.0|7.213126372469...
|0.02387379869447|0.0|0.1866693496827619|...
|1.89796699621085|0.0|0.3192169213385746|...
+----------------------------+
only showing top 5 rows
下面是我的熊猫DF输出的样子
0
0 [0.011936899347238104, 0.0, 0.5049431301173817...
1 [0.047747597388952415, 0.0, 0.1657316216149636...
2 [0.0, 0.0, 0.19441761495525278, 7.213126372469...
3 [0.023873798694476207, 0.0, 0.1866693496827619...
4 [1.8979669962108585, 0.0, 0.3192169213385746, ...
由于您希望所有功能都在单独的列中(正如我从您的编辑中得到的),因此您提供的答案的链接不是您的解决方案 试试这个
#column_names
temp = temp.rdd.map(lambda x:[float(y) for y in x['all_features']]).toDF(column_names)
编辑:
由于您的temp
最初是一个数据帧,因此您也可以使用此方法,而无需将其转换为rdd
,
你能明确地告诉我们你有什么输入,你想要的输出,以及你现在得到的输出吗?它帮助我们更好(更快)地了解您的问题。通常情况下,需要一个。例如,我不确定您的“all_features”列中有哪些值,因此我无法确定使用
.values.tolist()
会产生什么结果。您是否尝试了指定链接中给出的rdd.map(lambda x:(x,).toDF()
?“这通常是有效的。”抱歉。我已经添加了输出和预期输出now@mayankagrawal我尝试了rdd.map(lambda x:(x,).toDF()@mayankagrawal,它再次只返回一个名为“all_features”的列。然后,我尝试将其转换为Pandas DF,并执行了.values.tolist(),它只给出了一列,其中的值用逗号分隔。谢谢你!尝试了您的第一个解决方案,效果非常好!是否有一种方法可以使用我已有的列名列表为新创建的数据帧指定列名?
0
0 [0.011936899347238104, 0.0, 0.5049431301173817...
1 [0.047747597388952415, 0.0, 0.1657316216149636...
2 [0.0, 0.0, 0.19441761495525278, 7.213126372469...
3 [0.023873798694476207, 0.0, 0.1866693496827619...
4 [1.8979669962108585, 0.0, 0.3192169213385746, ...
#column_names
temp = temp.rdd.map(lambda x:[float(y) for y in x['all_features']]).toDF(column_names)
import pyspark.sql.functions as F
from pyspark.sql.types import *
splits = [F.udf(lambda val: float(val[i].item()),FloatType()) for i in range(200)]
temp = temp.select(*[s(F.col('all_features')).alias(c) for c,s in zip(column_names,splits)])
temp.show()