如何使用 python 在 Spark 中转置 DataFrame 而不进行聚合

Posted

技术标签:

【中文标题】如何使用 python 在 Spark 中转置 DataFrame 而不进行聚合【英文标题】:How to Transpose DataFrame Without Aggregation in Spark using python 【发布时间】:2021-09-08 14:14:56 【问题描述】:

这是输入数据框

+-----------+--------+--------+--------+--------+
|COLUMN_NAME| VALUE1 | VALUE2 | VALUE3 | VALUEN |
+-----------+--------+--------+--------+--------+
|col1       | val11  | val21  | val31  | valN1  |
|col2       | val12  | val22  | val32  | valN2  |
|col3       | val13  | val23  | val33  | valN3  |
|col4       | val14  | val24  | val34  | valN4  |
|col5       | val15  | val25  | val35  | valN5  |
+-----------+--------+--------+--------+--------+

我想转置如下:

+------+-------+------+-------+------+
|col1  | col2  |col3  | col4  |col5  |
+------+-------+------+-------+------+
|val11 | val12 |val13 | val14 |val15 |
|val21 | val22 |val23 | val24 |val25 |
|val31 | val32 |val33 | val34 |val35 |
|valN1 | valN2 |valN3 | valN4 |valN5 |
+------+-------+------+-------+------+

【问题讨论】:

请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。 【参考方案1】:

你的问题不是很清楚,但是如果你的数据框不是太大,你可以使用Pandas Melt function

df_pandas = df.toPandas()
df_pandas = df_pandas.melt(id_vars=['COLUMN_NAME'],value_vars=['VALUE_VARS'])
df_spark = spark.createDataFrame(df_pandas)

如果你的 df 很大,我会使用koalas melt function

Spark 也有 stack 功能,不太直观。

【讨论】:

感谢您的建议。这里的挑战是将 n 个 value_vars 传递给 melt 命令。我能够使用来自***.com/a/49403834/10736536 的 scala 代码,它工作正常,我想将其转换为 pyspark 代码, value_vars 的数量不同。我的一个输入数据帧有 5 个 value_vars,另一个数据帧有 7 个 value_vars。这就是为什么我尝试使用应该处理任意数量的 value_vars 的通用函数。希望这可以帮助。感谢您的帮助。 @Abhy 为什么我们不像这样获取 var cols -> cols = df.columns 然后删除 id_vars,将值 cols 列表传递给 melt 函数? cols.remove('id_vars') 只会留下值 vars。

以上是关于如何使用 python 在 Spark 中转置 DataFrame 而不进行聚合的主要内容,如果未能解决你的问题,请参考以下文章

使用scala在Spark中转置DataFrame而不进行聚合

在 Spark Scala 中转置 DataFrame 列 [重复]

在 JavaScript 中转置二维数组

在 Matlab 中转置 Python 创建的 HDF5 数据集

python 在Pandas中转置数据(长到宽)

在Python中转置和乘以列表