[英]How to aggregate multiple columns and output as rows?
我正在使用 pyspark,我有這樣的數據:
第 1 列 | 列2 | 第 3 列 |
---|---|---|
1 | 0 | 1 |
1 | 1 | 0 |
1 | 1 | 0 |
1 | 0 | 0 |
我想要的輸出是:
上校 | 和 |
---|---|
第 1 列 | 4 |
列2 | 2 |
第 3 列 | 1 |
我的第一個想法是將列名放在一個列表中,循環遍歷它,每次都將該列相加並將結果合並到一個新的 df 中。
然后我想,也許可以進行多次聚合,例如:
df.agg(sum('col1), sum('col2))
...然后想出一種方法來取消旋轉。
有更容易的方法嗎?
您可以使用stack
SQL函數來UNPIVOT一個數據幀,如所描述這里。 所以你的代碼會變成, input
作為你的輸入數據框:
from pyspark.sql import functions as F
output = input.agg(
F.sum("col1").alias("col1"),
F.sum("col2").alias("col2"),
F.sum("col3").alias("col3")
).select(
F.expr("stack(3, 'col1', col1, 'col2', col2, 'col3', col3) as (col,sum)")
)
如果您有以下input
數據框:
+----+----+----+
|col1|col2|col3|
+----+----+----+
|1 |0 |1 |
|1 |1 |0 |
|1 |1 |0 |
|1 |0 |0 |
+----+----+----+
您將獲得以下output
數據幀:
+----+---+
|col |sum|
+----+---+
|col1|4 |
|col2|2 |
|col3|1 |
+----+---+
據我所知,沒有更簡單的方法。 您可以在聚合后取消旋轉它,方法是首先將其轉換為 Pandas 數據幀,然后在其上調用transpose
或創建地圖,然后分解地圖以獲得作為col
和sum
列的結果。
# Assuming initial dataframe is df
aggDF = df.agg(*[F.sum(F.col(col_name)).alias(col_name) for col_name in df.columns])
# Using pandas
aggDF.toPandas().transpose().reset_index().rename({'index' : 'col', 0: 'sum'}, axis=1)
# Going spark all the way
aggDF.withColumn("col", F.create_map([e for col in aggDF.columns for e in (F.lit(col), F.col(col))])).selectExpr("explode(col) as (col, sum)").show()
# Both return
"""
+----+---+
| col|sum|
+----+---+
|col1| 4|
|col2| 2|
|col3| 1|
+----+---+
"""
如果需要,這適用於 3 列以上。
您可以先對每一列求和:
// input
val df = List((1,0,1),(1,1,0),(1,1,0),(1,0,0)).toDF("col1", "col2", "col3")
df.show
// sum each column
val sums = df.agg(sum("coL1").as("col1"), sum("col2").as("col2"),
sum("col3").as("col3"))
sums.show
+----+----+----+
|col1|col2|col3|
+----+----+----+
| 4| 2| 1|
+----+----+----+
這為您提供了一行 3 列的 DS。 您可以輕松收集。 如果這就是您想要的,請使用以下內容創建一個新數據集:
val sumRow = sums.first
val sumDS = List("col1" -> sumRow.getAs[Long]("col1"), "col2" ->
sumRow.getAs[Long]("col2"), "col3" -> sumRow.getAs[Long]("col3")).toDF("col", "sum")
sumDS.show
+----+---+
| col|sum|
+----+---+
|col1| 4|
|col2| 2|
|col3| 1|
+----+---+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.