Замените несколько строк несколькими значениями в Julia

В пандах Python вы можете передать словарь df.replace, чтобы заменить каждый соответствующий ключ соответствующим значением. Я часто использую эту функцию, чтобы заменить аббревиатуры слов на испанском языке, которые портят токенизаторы предложений.

Есть ли что-то подобное у Юли? Или даже лучше, чтобы я (и будущие пользователи) могли извлечь из опыта какие-либо идеи о том, как реализовать такую ​​​​функцию в красивом и производительном синтаксисе Джулии?

Спасибо!

Обновлено: добавление примера по запросу

Вход:

julia> DataFrames.DataFrame(Dict("A" => ["This is an ex.", "This is a samp.", "This is a samp. of an ex."]))
3×1 DataFrame
 Row │ A                  
     │ String             
─────┼────────────────────
   1 │ This is an ex.
   2 │ This is a samp.
   3 │ This is a samp. of an ex.

Желаемый результат:

3×1 DataFrame
 Row │ A                  
     │ String             
─────┼────────────────────
   1 │ This is an example
   2 │ This is a sample
   3 │ This is a sample of an example
В чем разница между методом "==" и equals()
В чем разница между методом "==" и equals()
Это один из наиболее часто задаваемых вопросов новичкам на собеседовании. Давайте обсудим его на примере.
Замена символа по определенному индексу в JavaScript
Замена символа по определенному индексу в JavaScript
В JavaScript существует несколько способов заменить символ в строке по определенному индексу.
5
0
121
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В Джулии для этого тоже есть функция replace. Он берет коллекцию и заменяет в ней элементы. Самая простая форма:

julia> x = ["a", "ab", "ac", "b", "bc", "bd"]
6-element Vector{String}:
 "a"
 "ab"
 "ac"
 "b"
 "bc"
 "bd"

julia> replace(x, "a" => "aa", "b" => "bb")
6-element Vector{String}:
 "aa"
 "ab"
 "ac"
 "bb"
 "bc"
 "bd"

Если у вас есть более сложный шаблон замены, вы можете передать функцию, которая выполняет замену:

julia> replace(x) do s
           length(s) == 1 ? s^2 : s
       end
6-element Vector{String}:
 "aa"
 "ab"
 "ac"
 "bb"
 "bc"
 "bd"

Существует также replace!, который делает то же самое на месте.

Это то, что вы хотели?

РЕДАКТИРОВАТЬ

Замена подстрок в векторе строк:

julia> df = DataFrame("A" => ["This is an ex.", "This is a samp.", "This is a samp. of an ex."])
3×1 DataFrame
 Row │ A
     │ String
─────┼───────────────────────────
   1 │ This is an ex.
   2 │ This is a samp.
   3 │ This is a samp. of an ex.

julia> df.A .= replace.(df.A, "ex." => "example", "samp." => "sample")
3-element Vector{String}:
 "This is an example"
 "This is a sample"
 "This is a sample of an example"

Обратите внимание на две вещи:

  1. вам не нужно передавать Dict в DataFrame конструктор. Достаточно просто пройти парами.
  2. В присваивании я использовал .=, а не =, который выполняет замену обновленных значений в уже существующем векторе на месте (я показываю это для сравнения с тем, что @Sundar R предложил в комментарии, который является альтернативой, которая выделяет новый вектор; разница, вероятно, не имеет большого значения в вашем случае, но я просто хотел показать вам оба синтаксиса).
replace! предназначен только для массивов и других изменяемых коллекций. Поскольку строки неизменяемы, для строк существует только replace.
Sundar R 15.10.2022 22:55

Кроме того, поскольку в заголовке упоминается несколько строк, а в вопросе упоминается pandas, я полагаю, что они хотят сделать эту замену в столбце DataFrame, например df.x = replace.(df.x, ...).

Sundar R 15.10.2022 22:56

Спасибо, это гениально. И реализация даже лучше, чем у Python, в том смысле, что она поддерживает регулярные выражения из коробки и учитывает максимальное количество замен, что является благом. @Sundar R, вы правы в том, что я действительно хотел заменить несколько строк, и ваш синтаксис вещания сделал последний трюк. Я принимаю ответ, учитывая, что он достаточно тщательный, чтобы добраться туда, но я думаю, было бы здорово, если бы его можно было отредактировать, чтобы он также отражал вклад Сундара. Спасибо вам обоим!

Dijkie85 15.10.2022 23:32

В этих случаях я обычно предпочитаю иметь карту, которая описывает мои замены в терминах словаря, а затем просто использовать старые значения в качестве ключей и новые, замененные значения в качестве значения dict.

Antonello 15.10.2022 23:38

Я могу отредактировать ответ, но можете ли вы привести в своем вопросе пример ввода и пример ожидаемого результата, чтобы я точно знал, чего вы хотите? Спасибо!

Bogumił Kamiński 15.10.2022 23:43

Другие вопросы по теме