pyspark数据帧转置问题

Posted

技术标签:

【中文标题】pyspark数据帧转置问题【英文标题】:pyspark dataframe transpose issue 【发布时间】:2020-04-11 12:35:03 【问题描述】:

我有一个带有相应列的以下输入数据框:

dim1,dim2,tran_clmn,input1,input2
101,201,Y1,1,2
102,202,Y2,2,3
103,203,Y3,3,4
104,204,Y4,4,5
105,205,Y5,5,6

我需要根据列 tran_clmn

将输入数据转置为下面的转置输出
dim1,dim2,new_trn_clm,Y1,Y2,Y3,Y4,Y5
101,201,input1,1,,,,
101,201,input2,2,,,,
102,202,input1,,2,,,
102,202,input2,,3,,,
103,203,input1,,,3,,
103,203,input2,,,4,,
104,204,input1,,,,4,
104,204,input2,,,,5,
105,205,input1,,,,,5
105,205,input2,,,,,6

如何实现这种场景?没有聚合选项。是否可以使用 groupBy 和 pivot 方法完成并获得结果?

【问题讨论】:

【参考方案1】:

两年前,我在这个post 中发现了一个执行这种转换(从宽到长)的函数。这对我很有帮助:也许对你也有帮助。

import pyspark.sql.functions as psf

def melt(df: DataFrame,
         id_vars: Iterable[str], value_vars: Iterable[str],
         var_name: str = "variable", value_name: str = "value"):
    """
    Convert :class:`DataFrame` from wide to long format.
    """
    # Create array<struct<variable: str, value: ...>>
    _vars_and_vals = psf.array(*(
        psf.struct(psf.lit(c).alias(var_name), psf.col(c).alias(value_name))
        for c in value_vars))
    # Add to the DataFrame and explode
    _tmp = df.withColumn("_vars_and_vals", psf.explode(_vars_and_vals))
    cols = id_vars + [
        psf.col("_vars_and_vals")[x].alias(x) for x in [var_name, value_name]]
    return _tmp.select(*cols)

在你的情况下,这可能是这样的(未经测试):

melt(df, id_vars=['dim1','dim2'],
                       value_vars=[input1','input2'],
                       var_name="tran_clmn", value_name="tran_clmn")

【讨论】:

以上是关于pyspark数据帧转置问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 pyspark 和 aws 胶水进行数据转置

在 Spark SQL (pyspark) 中将行转置为列

在 Pyspark 数据框中转置

嗨,我想在 pyspark 中转置一个数据框

Pyspark:基于所有列减去/差异 pyspark 数据帧

pyspark:在日期和时间上重新采样 pyspark 数据帧