【问题标题】:PySpark - How to transpose a Dataframe [duplicate]PySpark - 如何转置数据框 [重复]
【发布时间】:2019-04-09 19:03:45
【问题描述】:

我想转置一个数据框。这只是我原始数据框的一小部分摘录-

from pyspark.sql.functions import to_timestamp, date_format 
valuesCol = [('22','ABC Ltd','U.K.','class 1',102),('22','ABC Ltd','U.K.','class 2',73),('22','ABC Ltd','U.K.','class 3',92),
             ('51','Eric AB','Sweden','class 1',52),('51','Eric AB','Sweden','class 2',34),('51','Eric AB','Sweden','class 3',11)]
df = sqlContext.createDataFrame(valuesCol,['ID','Firm','Country','Class','Revenue'])
df.show()
+---+-------+-------+-------+-------+
| ID|   Firm|Country|  Class|Revenue|
+---+-------+-------+-------+-------+
| 22|ABC Ltd|   U.K.|class 1|    102|
| 22|ABC Ltd|   U.K.|class 2|     73|
| 22|ABC Ltd|   U.K.|class 3|     92|
| 51|Eric AB| Sweden|class 1|     52|
| 51|Eric AB| Sweden|class 2|     34|
| 51|Eric AB| Sweden|class 3|     11|
+---+-------+-------+-------+-------+

PySpark 中没有转置功能。实现必要结果的一种方法是在class1, class2 and class3 上创建3 个dataframes,然后加入(left join)它们。但这可能涉及网络上的重新洗牌,具体取决于哈希分区器,并且成本非常高。我敢肯定,应该有一个优雅而简单的方法。

预期输出:

+---+-------+-------+-------+-------+-------+
| ID|   Firm|Country| Class1| Class2| Class3|
+---+-------+-------+-------+-------+-------+
| 22|ABC Ltd|   U.K.|    102|     73|     92|
| 51|Eric AB| Sweden|     52|     34|     11|
+---+-------+-------+-------+-------+-------+

【问题讨论】:

    标签: python apache-spark dataframe pyspark transpose


    【解决方案1】:

    感谢link。我们必须在旋转时使用聚合函数,因为旋转总是在聚合的上下文中。聚合函数可以是求和、计数、平均值、最小值或最大值,具体取决于所需的输出 -

    df = df.groupBy(["ID","Firm","Country"]).pivot("Class").sum("Revenue")
    df.show()
    +---+-------+-------+-------+-------+-------+
    | ID|   Firm|Country|class 1|class 2|class 3|
    +---+-------+-------+-------+-------+-------+
    | 51|Eric AB| Sweden|     52|     34|     11|
    | 22|ABC Ltd|   U.K.|    102|     73|     92|
    +---+-------+-------+-------+-------+-------+
    

    【讨论】:

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