如何在PySpark中将列值用作字典的键?

5

我有一个小的 PySpark DataFrame df:

index    col1
0        1    
1        3
2        4

还有一个字典:

LOOKUP = {0: 2, 1: 5, 2: 5, 3: 4, 4: 6}

我现在想要给df添加一个额外的列col2,使其等于col1LOOKUP值。

我的输出应该是这样的:

index    col1 col2
0        1    5    
1        3    4
2        4    6

我尝试使用:

df = df.withColumn(col("col2"), LOOKUP[col("col1")])

但是使用expr和之前的方法都会报错。

在PySpark中如何实现这个?

2个回答

6
您可以使用从lookup字典创建的map列:
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,然后与你的数据框连接。

2

您可以在此处使用带有Python f-stringsCASE WHEN语句和LOOKUP字典:

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|
+-----+----+----+

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接