簡體   English   中英

如何聚合多列並輸出為行?

[英]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或創建地圖,然后分解地圖以獲得作為colsum列的結果。

# 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.

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