替换字典中的键值

replace key value from dictionary

下面是我的DF:

deviceDict = {'TABLET' : 'MOBILE', 'PHONE':'MOBILE', 'PC':'Desktop', 'CEDEX' : '', 'ST' : 'SAINT', 'AV' : 'AVENUE', 'BD': 'BOULEVARD'}
df = spark.createDataFrame([('TABLET', 'DAF ST PAQ BD'), ('PHONE', 'AVOTHA'),  ('PC', 'STPA CEDEX'), ('OTHER', 'AV DAF'), (None, None)], ["device_type", 'City'])
df.show()

输出:

+-----------+-------------+
|device_type|         City|
+-----------+-------------+
|     TABLET|DAF ST PAQ BD|
|      PHONE|       AVOTHA|
|         PC|   STPA CEDEX|
|      OTHER|       AV DAF|
|       null|         null|
+-----------+-------------+

目标是替换key/value,来自

的解决方案
tests = df.na.replace(deviceDict, 1)

结果:

+-----------+-------------+
|device_type|         City|
+-----------+-------------+
|     MOBILE|DAF ST PAQ BD|
|     MOBILE|       AVOTHA|
|    Desktop|   STPA CEDEX|
|      OTHER|       AV DAF|
|       null|         null|
+-----------+-------------+

它适用于 device_type,但我无法更改 city(即使使用子集)

预期输出:

+-----------+------------------------+
|device_type|                    City|
+-----------+------------------------+
|     MOBILE| DAF SAINT PAQ BOULEVARD|
|     MOBILE|                  AVOTHA|
|    Desktop|                    STPA|
|      OTHER|              AVENUE DAF|
|       null|                    null|
+-----------+------------------------+

City 没有发生替换,因为您试图在列值中进行部分替换。而函数 DataFrame.replace 使用整个值作为映射。

要实现您想要的列 City,您可以使用多个嵌套的 regexp_replace 表达式,您可以使用 Python functools.reduce 动态生成这些表达式,例如:

from functools import reduce
import pyspark.sql.functions as F

m = list(deviceDict.items())

df1 = df.na.replace(deviceDict, 1).withColumn(
    "City",
    reduce(
        lambda acc, x: F.regexp_replace(acc, rf"\b{x[0]}\b", x[1]),
        m[1:],
        F.regexp_replace(F.col("City"), rf"\b{m[0][0]}\b", m[0][1]),
    )
)

df1.show(truncate=False)
#+-----------+-----------------------+
#|device_type|City                   |
#+-----------+-----------------------+
#|MOBILE     |DAF SAINT PAQ BOULEVARD|
#|MOBILE     |AVOTHA                 |
#|Desktop    |STPA                   |
#|OTHER      |AVENUE DAF             |
#|null       |null                   |
#+-----------+-----------------------+