我有一個包含 3 列的資料框,如下所示

我想旋轉并填充 id 上的列,以便每一行包含每個 id 列組合的列,其中值是該 id 的值,如下所示

ID注意:如果不匹配,則顯示零或 Null 。例如ID2_colA,在前Id2_ColB兩行得到 0,在第 3 行得到 0,列中有更多不同的值。為了便于說明而縮短了它ID1_calAID1_ColBID
如何在 pyspark 中實作這一點?
這是第一個資料幀的代碼:
data = [(("ID1", 3, 5)), (("ID1", 4, 12)), (("ID2", 8, 3))]
df = spark.createDataFrame(data, ["ID", "colA", "colB"])
uj5u.com熱心網友回復:
您可以創建一個映射列,其中值是列colA, colB而鍵是文字colA和 colB名稱與ID列的連接。然后,分解地圖并旋轉生成的value列,如下所示:
from itertools import chain
import pyspark.sql.functions as F
df.select(
"ID", "colA", "colB",
F.explode(
F.create_map(
*list(chain(*[[F.concat_ws("_", F.lit(c), F.col("ID")), F.col(c)] for c in ["colA", "colB"]]))
)
)
).groupBy("ID", "colA", "colB") \
.pivot("key").agg(F.first("value")) \
.fillna(0) \
.show()
# --- ---- ---- -------- -------- -------- --------
#|ID |colA|colB|colA_ID1|colA_ID2|colB_ID1|colB_ID2|
# --- ---- ---- -------- -------- -------- --------
#|ID2|8 |3 |0 |8 |0 |3 |
#|ID1|3 |5 |3 |0 |5 |0 |
#|ID1|4 |12 |4 |0 |12 |0 |
# --- ---- ---- -------- -------- -------- --------
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/416381.html
標籤:
