В пандах 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


В Джулии для этого тоже есть функция 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"
Обратите внимание на две вещи:
Dict в DataFrame конструктор. Достаточно просто пройти парами..=, а не =, который выполняет замену обновленных значений в уже существующем векторе на месте (я показываю это для сравнения с тем, что @Sundar R предложил в комментарии, который является альтернативой, которая выделяет новый вектор; разница, вероятно, не имеет большого значения в вашем случае, но я просто хотел показать вам оба синтаксиса).Кроме того, поскольку в заголовке упоминается несколько строк, а в вопросе упоминается pandas, я полагаю, что они хотят сделать эту замену в столбце DataFrame, например df.x = replace.(df.x, ...).
Спасибо, это гениально. И реализация даже лучше, чем у Python, в том смысле, что она поддерживает регулярные выражения из коробки и учитывает максимальное количество замен, что является благом. @Sundar R, вы правы в том, что я действительно хотел заменить несколько строк, и ваш синтаксис вещания сделал последний трюк. Я принимаю ответ, учитывая, что он достаточно тщательный, чтобы добраться туда, но я думаю, было бы здорово, если бы его можно было отредактировать, чтобы он также отражал вклад Сундара. Спасибо вам обоим!
В этих случаях я обычно предпочитаю иметь карту, которая описывает мои замены в терминах словаря, а затем просто использовать старые значения в качестве ключей и новые, замененные значения в качестве значения dict.
Я могу отредактировать ответ, но можете ли вы привести в своем вопросе пример ввода и пример ожидаемого результата, чтобы я точно знал, чего вы хотите? Спасибо!
replace!предназначен только для массивов и других изменяемых коллекций. Поскольку строки неизменяемы, для строк существует толькоreplace.