Проблема в том, что mapping_expr
вернет null
для любого города, который не содержится в city_dict
.Быстрое решение состоит в том, чтобы использовать coalesce
для возврата city
, если mapping_expr
возвращает значение null
:
from pyspark.sql.functions import coalesce
#lookup and replace
df1= df.withColumn('new_city', coalesce(mapping_expr[df['city']], df['city']))
df1.show()
#+---+--------+------+--------+
#| no| city|amount|new_city|
#+---+--------+------+--------+
#| 1| Kenora| 56%| X|
#| 2| Sudbury| 23%| Sudbury|
#| 3| Kenora| 71%| X|
#| 4| Sudbury| 41%| Sudbury|
#| 5| Kenora| 33%| X|
#| 6| Niagara| 22%| X|
#| 7|Hamilton| 88%|Hamilton|
#+---+--------+------+--------+
df1.groupBy('new_city').count().show()
#+--------+-----+
#|new_city|count|
#+--------+-----+
#| X| 4|
#|Hamilton| 1|
#| Sudbury| 2|
#+--------+-----+
Приведенный выше метод завершится неудачно, однакоесли одно из значений замены null
.
В этом случае более простой альтернативой может быть использование pyspark.sql.DataFrame.replace()
:
Первое использование withColumn
для создания new_city
в качестве копии значений изстолбец city
.
df.withColumn("new_city", df["city"])\
.replace(to_replace=city_dict.keys(), value=city_dict.values(), subset="new_city")\
.groupBy('new_city').count().show()
#+--------+-----+
#|new_city|count|
#+--------+-----+
#| X| 4|
#|Hamilton| 1|
#| Sudbury| 2|
#+--------+-----+