按同一列分组后取消pivot pysparkDataframe

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

正在寻找将Dataframex转换为y的任何线索。
我试过使用unpivot,在按ai和country列分组之后。显然,不可能在按同一列分组后取消对列的IVOT。一些完全不同的方法也可以。
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"
cedebl8k

cedebl8k1#

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

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|
+-------+---+---+---+
j13ufse2

j13ufse22#

类似于@mck的答案,但是你可以使用spark 3+ count_if 函数而不是强制转换为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|

# +-------+---+---+---+

相关问题