按同一列分组后取消pivot pysparkDataframe

5rgfhyps  于 2021-07-13  发布在  Spark
关注(0)|答案(2)|浏览(394)

正在寻找将Dataframex转换为y的任何线索。
我试过使用unpivot,在按ai和country列分组之后。显然,不可能在按同一列分组后取消对列的IVOT。一些完全不同的方法也可以。
x码:

  1. A1,A2,A3,country
  2. True,False,True,"USA"
  3. False,False,False,"USA"
  4. False,True,False,"USA"
  5. False,False,True,"USA"
  6. False,False,False,"USA"
  7. True,False,False,"RUS"
  8. False,True,False,"RUS"
  9. False,False,False,"RUS"
  10. False,False,False,"RUS"
  11. True,False,False,"ENG"
  12. False,False,True,"ENG"
  13. False,False,False,"CHN"

是:

  1. A1,A2,A3,country
  2. 1,1,2,"USA"
  3. 1,1,0,"RUS"
  4. 1,0,1,"ENG"
  5. 0,0,0,"CHN"
cedebl8k

cedebl8k1#

您可以按国家/地区分组,并对其他列进行汇总:

  1. df2 = df.groupBy('country').agg(*[F.sum(F.col(c).cast('int')).alias(c) for c in ['A1', 'A2', 'A3']])
  2. df2.show()
  3. +-------+---+---+---+
  4. |country| A1| A2| A3|
  5. +-------+---+---+---+
  6. | ENG| 1| 0| 1|
  7. | USA| 1| 1| 2|
  8. | RUS| 1| 1| 0|
  9. | CHN| 0| 0| 0|
  10. +-------+---+---+---+
j13ufse2

j13ufse22#

类似于@mck的答案,但是你可以使用spark 3+ count_if 函数而不是强制转换为int和求和:

  1. df1 = df.groupby("country").agg(
  2. *[F.expr(f"count_if({c})").alias(c) for c in df.columns if c != "country"]
  3. )
  4. df1.show()
  5. # +-------+---+---+---+
  6. # |country| A1| A2| A3|
  7. # +-------+---+---+---+
  8. # | ENG| 1| 0| 1|
  9. # | USA| 1| 1| 2|
  10. # | RUS| 1| 1| 0|
  11. # | CHN| 0| 0| 0|
  12. # +-------+---+---+---+
展开查看全部

相关问题