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

Posted

技术标签:

【中文标题】嗨,我想在 pyspark 中转置一个数据框【英文标题】:Hi, I want to transpose a dataframe in pyspark 【发布时间】:2021-12-16 12:23:11 【问题描述】:

df_original

数据框看起来像这样。但是,我想像这样转置它

df_resulting

任何人都可以提出任何方法。

我已经尝试过枢轴,但在这种情况下它不起作用

【问题讨论】:

【参考方案1】:

假设您有一个名为 df 的数据框,其结构如下。

df.show()
+--------+---------+--------+-----+
|    duns|eff_month|other_p1|pc_p1|
+--------+---------+--------+-----+
|69193610|        1|   0.123|0.109|
|69193610|        2|   0.456| 0.79|
|69193610|        3|   0.789| 0.92|
|69193610|        4|   0.132| 0.16|
|69193610|        5|   0.456|0.596|
|69193610|        6|   0.835|0.783|
|69193610|        7|   0.743|0.876|
|69193610|        8|   0.743|0.584|
|69193610|        9|   0.013|0.684|
|69193610|       10|   0.451| 0.09|
|69193610|       11|   0.399|0.791|
|69193610|       12|   0.423|0.242|
|69193611|        1|   0.091|0.808|
|69193611|        2|   0.451|0.768|
|69193611|        3|   0.132|0.269|
|69193611|        4|   0.819|0.863|
|69193611|        5|   0.312|0.362|
|69193611|        6|   0.382| 0.93|
|69193611|        7|   0.981| 0.09|
|69193611|        8|   0.128|0.416|
|69193611|        9|   0.481|0.168|
|69193611|       10|   0.291|0.601|
|69193611|       11|   0.312|0.264|
|69193611|       12|   0.321|0.758|
+--------+---------+--------+-----+

您可以执行以下操作。

from pyspark.sql import functions

df = (df.withColumn("eff_month", 
          functions.concat(functions.lit("month"), 
          functions.col("eff_month"))))

df1 = (df.groupBy("duns")
         .pivot("eff_month")
         .agg(functions.sum("pc_p1"))
         .withColumn("_NAME_", functions.lit("pc_p1")))

df2 = (df.groupBy("duns")
         .pivot("eff_month")
         .agg(functions.sum("other_p1"))
         .withColumn("_NAME_", functions.lit("other_p1")))

final_df = df1.union(df2)

final_df.show()
+--------+------+-------+-------+-------+------+------+------+------+------+------+------+------+--------+
|    duns|month1|month10|month11|month12|month2|month3|month4|month5|month6|month7|month8|month9|  _NAME_|
+--------+------+-------+-------+-------+------+------+------+------+------+------+------+------+--------+
|69193610| 0.109|   0.09|  0.791|  0.242|  0.79|  0.92|  0.16| 0.596| 0.783| 0.876| 0.584| 0.684|   pc_p1|
|69193611| 0.808|  0.601|  0.264|  0.758| 0.768| 0.269| 0.863| 0.362|  0.93|  0.09| 0.416| 0.168|   pc_p1|
|69193610| 0.123|  0.451|  0.399|  0.423| 0.456| 0.789| 0.132| 0.456| 0.835| 0.743| 0.743| 0.013|other_p1|
|69193611| 0.091|  0.291|  0.312|  0.321| 0.451| 0.132| 0.819| 0.312| 0.382| 0.981| 0.128| 0.481|other_p1|
+--------+------+-------+-------+-------+------+------+------+------+------+------+------+------+--------+

【讨论】:

非常感谢您的帮助。你是个天才:)

以上是关于嗨,我想在 pyspark 中转置一个数据框的主要内容,如果未能解决你的问题,请参考以下文章

在 HIVE 中转置数据

如何在Spark中转置数据框?

我只需要在 pyspark 数据框中附加那些具有非空值的人

Python pyspark 将 DF 写入 .csv 并存储在本地 C 盘

如何在 PostgreSQL 中转置列和行(即如何切换行和列)? [复制]

python, pyspark : 获取 pyspark 数据框列值的总和