Как заменить значения в столбце

При работе со строками иногда приходится заменять одни строки столбца DataFrame на другие. Apache PySpark предлагает массу возможностей это сделать. В этой статье поговорим о том, как заменить строковые значения столбца с помощью регулярных выражений, как заменить определенные символы через функцию translate, а также как заменить значения одного столбца на значения другого через функцию overlay.

В качестве исходной таблице будет использовать DataFrame ниже. Также мы заранее импортировали функции PySpark SQL.

import pyspark.sql.functions as F

df = spark.createDataFrame([
    ('py', 'Anton'),
    ('c', 'Valentina'),
    ('py', 'Andry23'),
    ('cpp', 'Alex189'), ],
    ['lang', 'name']
)

Как заменить строковые значения в одном столбце в PySpark

Возможно вам понадобилось заменить или подправить некоторые строковые значения столбца. Тогда вы можете воспользоваться SQL-функцией regexp_replace, которая на основании регулярного выражения будет заменять соответствующие символы. Первым параметром функция regexp_replace принимает имя столбца, вторым — регулярное выражение, третьим — на что заменяем.

Код курса
GRAS
Ближайшая дата курса
по запросу
Продолжительность
ак.часов
Стоимость обучения
0 руб.

Допустим требуется заменить все имена начинающиеся с An на On. Тогда код на Python для замены строки на основе регулярного выражения выглядит так:

df.withColumn('name', F.regexp_replace('name', 'An', 'Or'))
"""
+----+---------+
|lang|     name|
+----+---------+
|  py|    Orton|
|   c|Valentina|
|  py|  Ordry23|
| cpp|  Alex189|
+----+---------+
"""

Или, например, нужно убрать цифры из имён. В нашем DataFrame две таких записи с цифрами, от которых мы хотим избавиться. Это сделать можно через диапазоны [0-9], вот так:

# Либо просто один столбец вернуть:
# df.select(F.regexp_replace('name', 'An', 'Or').alias('name'))

df.withColumn('name', F.regexp_replace('name', '[0-9]', ''))
"""
+----+---------+------+------+---+
|lang|     name|  city|salary|age|
+----+---------+------+------+---+
|  py|    Anton|Moscow|    23| 19|
|   c|Valentina|  Omsk|    27| 25|
|  py|    Andry|Moscow|    24| 22|
| cpp|     Alex|  Omsk|    32| 25|
+----+---------+------+------+---+
"""

Регулярные выражения — это очень полезный инструмент, о котором можно говорить долго. У нас даже есть небольшая статья, где вы можете ознакомиться с ними.

Как заменить один символ за другой в PySpark

Если вам нужно заменить только некоторые символы, то используйте функцию translate, которая должна работать быстрее, чем regexp_replace. Первый параметр — имя столбца, второй — последовательность символом для замены, третий — символы, на которые заменяем.

Например, следующий код в PySpark:

df.select(F.translate('name', 'Aer', '$!').alias('name'))

— заменит символ A на $, e на ! и r на пустой символ (т.е. просто удалит его).

"""
+---------+
|     name|
+---------+
|    $nton|
|Val!ntina|
|   $ndy23|
|  $l!x189|
+---------+
"""

Как заменить значения одного столбца на значения другого

В PySpark 3.0 появилась функция overlay, которая заменяет строку одного столбца на заданные символы строки другого столбца. Первым параметром src задает столбец, куда происходит замена, второй replace — откуда (из какого столбца), третий pos — от какого индекса заменяемой строки производить замену, четвертый len — сколько символов нужно заменить.

Четвертый параметр по умолчанию равен -1, что значит заменить столько символов, сколько имеется во втором столбце, т.е. все. Рассмотрим примеры.

Выставим pos = 0:

df.withColumn('res', F.overlay('name', 'lang', 0))
"""
+----+---------+----------+
|lang|     name|       res|
+----+---------+----------+
|  py|    Anton|    pynton|
|   c|Valentina|cValentina|
|  py|  Andry23|  pyndry23|
| cpp|  Alex189|  cppex189|
+----+---------+----------+
"""

Как видим, первый символ, т.е. символ с индексом 0, был заменен на строку из lang.

А вот при значении pos превышающем количество символов в src результат будет просто добавлен в конец:

df.withColumn('res', F.overlay('name', 'lang', 100).alias('res'))
"""
+----+---------+----------+
|lang|     name|       res|
+----+---------+----------+
|  py|    Anton|   Antonpy|
|   c|Valentina|Valentinac|
|  py|  Andry23| Andry23py|
| cpp|  Alex189|Alex189cpp|
+----+---------+----------+
"""

Значение len определяет сколько символов нужно заменить. Например, следующий код на Python:

df.withColumn('res', F.overlay('name', 'lang', 3, 5).alias('res'))
"""
+----+---------+-----+
|lang|     name|  res|
+----+---------+-----+
|  py|    Anton| Anpy|
|   c|Valentina|Vacna|
|  py|  Andry23| Anpy|
| cpp|  Alex189|Alcpp|
+----+---------+-----+
"""

Заменяет строку, начиная с 3-го символа, на 5 символов из столбца replace. Если в столбце replace нет столько символов, то в заменяемой строке будут удалены столько, сколько не хватает. Например, в строке Valentina 5 символов, начиная с 3-ей, следующие: lenti — эти символы будут заменены на c.

 

Отметим также, что все эти функции могут быть использованы с методами фильтрации, о котором говорили тут. А еще больше подробностей о способах обработки строк в PySpark вы узнаете на наших образовательных курсах в лицензированном учебном центре обучения и повышения квалификации руководителей и IT-специалистов (менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data) в Москве:

Записаться на курс

Смотреть раcписание

Источники
  1. regexp_replace
  2. translate
  3. overlay

Добавить комментарий

Поиск по сайту