我正在使用 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))
...然后想出一種方法來取消旋轉。
有更容易的方法嗎?
uj5u.com熱心網友回復:
您可以使用stackSQL函式來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 |
---- ---
uj5u.com熱心網友回復:
據我所知,沒有更簡單的方法。您可以在聚合后取消旋轉它,方法是首先將其轉換為 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 列以上。
uj5u.com熱心網友回復:
您可以先對每一列求和:
// 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|
---- ---
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/319108.html
下一篇:加速實驗,限制Spark為單核
