簡體   English   中英

按同一列分組后取消透視 pyspark dataframe

[英]Unpivot pyspark dataframe after Grouping by the same column

尋找將 dataframe X 轉換為 Y 的任何線索。

在按A i 和國家列分組后,我嘗試使用 unpivot。 顯然,在按同一列分組后,不可能對列進行反透視。 一些完全不同的方法也可以。

X:

A1,A2,A3,country
True,False,True,"USA"
False,False,False,"USA"
False,True,False,"USA"
False,False,True,"USA"
False,False,False,"USA"
True,False,False,"RUS"
False,True,False,"RUS"
False,False,False,"RUS"
False,False,False,"RUS"
True,False,False,"ENG"
False,False,True,"ENG"
False,False,False,"CHN"

是的:

A1,A2,A3,country
1,1,2,"USA"
1,1,0,"RUS"
1,0,1,"ENG"
0,0,0,"CHN"

您可以按國家/地區分組並總結其他列:

df2 = df.groupBy('country').agg(*[F.sum(F.col(c).cast('int')).alias(c) for c in ['A1', 'A2', 'A3']])

df2.show()
+-------+---+---+---+
|country| A1| A2| A3|
+-------+---+---+---+
|    ENG|  1|  0|  1|
|    USA|  1|  1|  2|
|    RUS|  1|  1|  0|
|    CHN|  0|  0|  0|
+-------+---+---+---+

類似於@mck 的答案,但對於 Spark 3+,您可以使用count_if function 而不是轉換為 int 和求和:

df1 = df.groupby("country").agg(
    *[F.expr(f"count_if({c})").alias(c) for c in df.columns if c != "country"]
)

df1.show()

#+-------+---+---+---+
#|country| A1| A2| A3|
#+-------+---+---+---+
#|    ENG|  1|  0|  1|
#|    USA|  1|  1|  2|
#|    RUS|  1|  1|  0|
#|    CHN|  0|  0|  0|
#+-------+---+---+---+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM