首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PySpark:如何转置数据帧中的多个列

PySpark:如何转置数据帧中的多个列
EN

Stack Overflow用户
提问于 2020-11-27 21:49:08
回答 3查看 694关注 0票数 3

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

输入数据帧-

代码语言:javascript
复制
A    B    C   D

1    2    3   4

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

所需的输出(转置)数据

代码语言:javascript
复制
A  1

B  2

C  3

D  4

A  11

B  12

C  13

D  14

....
......

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

EN

回答 3

Stack Overflow用户

发布于 2020-11-27 21:55:07

代码语言:javascript
复制
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|
+---+-----+
票数 2
EN

Stack Overflow用户

发布于 2020-11-27 22:06:00

在spark中使用stack函数。

Example:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2020-11-28 15:44:05

你可以像下面这样做一个泛化函数(灵感来自于我之前的答案here):

代码语言:javascript
复制
def stack_multiple_col(df,cols=df.columns,output_columns=["col","values"]):
  """stacks multiple columns in a dataframe, 
     takes all columns by default unless passed a list of values"""
  return (f"""stack({len(cols)},{','.join(map(','.join,
         (zip([f'"{i}"' for i in cols],cols))))}) as ({','.join(output_columns)})""")

示例运行:

代码语言:javascript
复制
df.selectExpr(stack_multiple_col(df)).show()

+---+------+
|col|values|
+---+------+
|  A|     1|
|  B|     2|
|  C|     3|
|  D|     4|
|  A|    10|
|  B|    11|
|  C|    12|
|  D|    13|
+---+------+

df.selectExpr(stack_multiple_col(df,cols=['A','B'],output_columns=["A","B"])).show()
+---+---+
|  A|  B|
+---+---+
|  A|  1|
|  B|  2|
|  A| 10|
|  B| 11|
+---+---+
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65038470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档