【问题标题】:PySpark: How to Transpose multiple columns in a DataframePySpark:如何转置数据框中的多列
【发布时间】:2020-11-27 13:49:08
【问题描述】:

我是 Spark 的新手,在使用 PySpark 或 Spark Sql 将以下输入数据帧转换为所需的输出 df(行到列)时需要帮助。

输入数据框-

A    B    C   D

1    2    3   4

10   11   12  13
......
........

所需的输出(转置)数据

A  1

B  2

C  3

D  4

A  11

B  12

C  13

D  14

....
......

如果我可以根据我们的要求旋转输入数据(列)会更好。

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql pivot transpose


    【解决方案1】:

    在 spark 中使用 stack 函数。

    Example:

    df.show()
    #+---+---+---+---+
    #|  A|  B|  C|  D|
    #+---+---+---+---+
    #|  1|  2|  3|  4|
    #| 10| 11| 12| 13|
    #+---+---+---+---+
    
    from pyspark.sql.functions import *
    
    df.selectExpr("stack(4,'A',A,'B',B,'C',C,'D',D) as (key,value)").show()
    #+---+-----+
    #|key|value|
    #+---+-----+
    #|  A|    1|
    #|  B|    2|
    #|  C|    3|
    #|  D|    4|
    #|  A|   10|
    #|  B|   11|
    #|  C|   12|
    #|  D|   13|
    #+---+-----+
    

    【讨论】:

      【解决方案2】:

      您可以制作如下所示的通用函数(灵感来自我之前的回答here):

      def stack_multiple(data,cols=None,output_columns=["col","values"]):
          """stacks multiple columns in a dataframe, 
             takes all columns by default unless passed a list of values"""
      
          cols = data.columns if cols is None else cols
          cols= [cols] if isinstance(cols,str) else cols
      
          return data.selectExpr(f"""stack({len(cols)},{','.join(map(','.join,
                     (zip([f'"{i}"' for i in cols],[f"`{i}`" for i in cols]))))}) 
                      as ({','.join(output_columns)})""")
      

      样本运行:

      stack_multiple(df).show()
      
      +---+------+
      |col|values|
      +---+------+
      |  A|     1|
      |  B|     2|
      |  C|     3|
      |  D|     4|
      |  A|    10|
      |  B|    11|
      |  C|    12|
      |  D|    13|
      +---+------+
      
      stack_multiple(df,['A','B'],output_columns=['A','B']).show()
      
      +---+---+
      |  A|  B|
      +---+---+
      |  A|  1|
      |  B|  2|
      |  A| 10|
      |  B| 11|
      +---+---+
      

      【讨论】:

        【解决方案3】:
        df = spark.createDataFrame([[1,2,3,4],[10,11,12,13]]).toDF('A','B','C','D')
        +---+---+---+---+
        |  A|  B|  C|  D|
        +---+---+---+---+
        |  1|  2|  3|  4|
        | 10| 11| 12| 13|
        +---+---+---+---+
        
        
        df.select(
            F.explode(
                F.create_map(
                    *reduce(lambda x, y: x+y,
                        [[F.lit(col), col] for col in df.columns]
                    )
                )
            )
        )
        +---+-----+
        |key|value|
        +---+-----+
        |  A|    1|
        |  B|    2|
        |  C|    3|
        |  D|    4|
        |  A|   10|
        |  B|   11|
        |  C|   12|
        |  D|   13|
        +---+-----+
        

        【讨论】:

          猜你喜欢
          • 2019-09-08
          • 1970-01-01
          • 2022-08-18
          • 1970-01-01
          • 1970-01-01
          • 2019-04-09
          • 1970-01-01
          • 2021-08-09
          • 1970-01-01
          相关资源
          最近更新 更多