[英]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.