Заменить дубликаты новыми значениями в фрейме данных

У меня есть фрейм данных с некоторыми повторяющимися значениями в одном из столбцов:

df = DataFrame(A=["a","a","b"])

Что я хотел бы сделать, так это заменить все значения уникальными значениями и добавочным порядком, если есть повторяющиеся значения, например:

df = DataFrame(A=["a_1","a_2","b_1"])

Я знаю, что в R это можно сделать с помощью make.unique, но есть ли аналогичная функция в Julia?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Если вам нужен именно этот вывод, насколько я могу судить, для этого нет готовой функции, но вы можете сделать, например.

julia> transform(groupby(df, :A), :A => (x -> string.(x, "_", 1:length(x))) => :A_unique)
3×2 DataFrame
 Row │ A       A_unique
     │ String  String
─────┼──────────────────
   1 │ a       a_1
   2 │ a       a_2
   3 │ b       b_1

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

function uniquify(v)
    d = Dict{eltype(v),Int}()
    return map(v) do e
        d[e] = tmp = get(d, e, 0)+1
        return "$(e)_$tmp"
    end
end

Затем,

julia> df = DataFrame(A=uniquify(["a","a","b"]))
3×1 DataFrame
 Row │ A      
     │ String 
─────┼────────
   1 │ a_1
   2 │ a_2
   3 │ b_1

Обновлено: после небольшого сжатия и использования string, как это сделал Богумил в другом ответе, это 1-строчная версия uniquify (работает так же, как и раньше):

uniquify(v; d = Dict{eltype(v),Int}()) =
  [string(e,'_',(d[e] = get(d,e,0)+1;)) for e in v]

Спасибо! Можете ли вы объяснить мне, что здесь делает get(d, e, 0)? Кажется, я понимаю, что он каждый раз увеличивает значение на 1, но для чего именно нужен 0?

august 25.04.2023 20:32

@август 0 — это значение по умолчанию, которое возвращает get, если не находит e. Это важно, так как вы хотите начать считать с 0, а затем добавить 1.

Dan Getz 26.04.2023 01:32

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