在Apache Spark中使用pyspark进行数据帧转置

Mèh*_*ida 6 python transpose dataframe apache-spark pyspark

我有一个df具有以下结构的数据框:

+-----+-----+-----+-------+
|  s  |col_1|col_2|col_...|
+-----+-----+-----+-------+
| f1  |  0.0|  0.6|  ...  |
| f2  |  0.6|  0.7|  ...  |
| f3  |  0.5|  0.9|  ...  |
|  ...|  ...|  ...|  ...  |
Run Code Online (Sandbox Code Playgroud)

我想计算这个数据帧的转置,所以它看起来像

+-------+-----+-----+-------+------+
|  s    | f1  | f2  | f3    |   ...|
+-------+-----+-----+-------+------+
|col_1  |  0.0|  0.6|  0.5  |   ...|
|col_2  |  0.6|  0.7|  0.9  |   ...|
|col_...|  ...|  ...|  ...  |   ...|
Run Code Online (Sandbox Code Playgroud)

我绑定了这两个解决方案,但它返回的数据帧没有指定的used方法:

方法1:

 for x in df.columns:
    df = df.pivot(x)
Run Code Online (Sandbox Code Playgroud)

方法2:

df = sc.parallelize([ (k,) + tuple(v[0:]) for k,v in df.items()]).toDF()
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题.

hi-*_*zir 9

如果数据足够小以便转置(不用聚合转动),您只需将其转换为Pandas DataFrame:

df = sc.parallelize([
    ("f1", 0.0, 0.6, 0.5),
    ("f2", 0.6, 0.7, 0.9)]).toDF(["s", "col_1", "col_2", "col_3"])

df.toPandas().set_index("s").transpose()
s       f1   f2
col_1  0.0  0.6
col_2  0.6  0.7
col_3  0.5  0.9
Run Code Online (Sandbox Code Playgroud)

如果它为此大,Spark将无济于事.Spark DataFrame按行分配数据(尽管本地使用柱状存储),因此单个行的大小仅限于本地内存.

  • 您可能希望在将索引转换回Spark Dataframe之前重置索引,以便不丢失行中的列名.您可以使用命令'reset_index'来完成.例如:df.toPandas().set_index("s").transpose().reset_index() (2认同)
  • @Aspirant `spark.createDataFrame(result)` (2认同)