我有一個小的 PySpark DataFrame df:
index col1
0 1
1 3
2 4
還有一本字典:
LOOKUP = {0: 2, 1: 5, 2: 5, 3: 4, 4: 6}
我現在想添加一個額外的列col2來df,等于LOOKUP值col1。
我的輸出應該是這樣的:
index col1 col2
0 1 5
1 3 4
2 4 6
我嘗試使用:
df = df.withColumn(col("col2"), LOOKUP[col("col1")])
但這給了我錯誤,以及使用expr.
如何在 PySpark 中實作這一點?
uj5u.com熱心網友回復:
您可以使用map從lookup字典中創建的列:
from itertools import chain
from pyspark.sql import functions as F
lookup = {0: 2, 1: 5, 2: 5, 3: 4, 4: 6}
lookup_map = F.create_map(*[F.lit(x) for x in chain(*lookup.items())])
df1 = df.withColumn("col2", lookup_map[F.col("col1")])
df1.show()
# ----- ---- ----
#|index|col1|col2|
# ----- ---- ----
#| 0| 1| 5|
#| 1| 3| 4|
#| 2| 4| 6|
# ----- ---- ----
另一種方法是lookup_df從 dict創建一個,然后加入您的資料框
uj5u.com熱心網友回復:
您在這里使用CASE WHEN帶有 python的陳述句和字典:f-stringsLOOKUP
from pyspark.sql import functions as F
column = 'col1' #column to replace
e = f"""CASE {' '.join([f"WHEN {column}='{k}' THEN '{v}'" for k,v in LOOKUP.items()])}
ELSE NULL END"""
out = df.withColumn("col2",F.expr(e))
out.show()
----- ---- ----
|index|col1|col2|
----- ---- ----
| 0| 1| 5|
| 1| 3| 4|
| 2| 4| 6|
----- ---- ----
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/392729.html
標籤:Python 数据框 阿帕奇火花 火花 apache-spark-sql
