【问题标题】:Dataframe transpose with pyspark in Apache Spark在 Apache Spark 中使用 pyspark 转置数据帧
【发布时间】:2018-03-09 05:56:44
【问题描述】:

我有一个数据框df,其结构如下:

+-----+-----+-----+-------+
|  s  |col_1|col_2|col_...|
+-----+-----+-----+-------+
| f1  |  0.0|  0.6|  ...  |
| f2  |  0.6|  0.7|  ...  |
| f3  |  0.5|  0.9|  ...  |
|  ...|  ...|  ...|  ...  |

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

+-------+-----+-----+-------+------+
|  s    | f1  | f2  | f3    |   ...|
+-------+-----+-----+-------+------+
|col_1  |  0.0|  0.6|  0.5  |   ...|
|col_2  |  0.6|  0.7|  0.9  |   ...|
|col_...|  ...|  ...|  ...  |   ...|

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

方法一:

 for x in df.columns:
    df = df.pivot(x)

方法二:

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

我该如何解决这个问题。

【问题讨论】:

标签: python apache-spark dataframe pyspark transpose


【解决方案1】:

如果数据小到可以转置(未通过聚合进行旋转),您可以将其转换为 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

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

【讨论】:

  • 您可能希望在将索引转换回 Spark Dataframe 之前重置索引,以免丢失行中的列名。您可以使用命令“reset_index”来完成。例如:df.toPandas().set_index("s").transpose().reset_index()
  • 我们如何将结果再次转换为数据框?
  • @Aspirant spark.createDataFrame(result)
【解决方案2】:

您可以通过数据块尝试考拉。 Koalas 与 Pandas 类似,但专为分布式处理而设计,可在 Pyspark 中使用(至少从 3.0.0 开始)。

kdf = df.to_koalas()
kdf_t = kdf.transpose()
df_T = kdf_t.to_spark()

编辑:要有效地访问考拉,您需要定义分区,否则可能会导致性能严重下降。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 2021-05-21
    • 1970-01-01
    相关资源
    最近更新 更多