Видимые проблемы со строковыми значениями DataFrame - PullRequest
0 голосов
/ 23 сентября 2018

Я не уверен, является ли это реальной проблемой или я просто что-то не так делаю, но в данный момент это кажется мне немного странным.

При использовании DataFrames я сталкивался спроблема, где, если вы копируете DataFrame в другую переменную, то любые изменения, внесенные в одну из переменных, изменяют обе.Это относится и к отдельным столбцам.Например:

julia> x = DataFrame(A = ["pink", "blue", "green"], B = ["yellow", "red", "purple"]);
julia> y = x;
julia> x[x.A .== "blue", :A] = "red";
julia> x
3×2 DataFrame
│ Row │ A     │ B      │
├─────┼───────┼────────┤
│ 1   │ pink  │ yellow │
│ 2   │ red   │ red    │
│ 3   │ green │ purple │

julia> y
3×2 DataFrame
│ Row │ A     │ B      │
├─────┼───────┼────────┤
│ 1   │ pink  │ yellow │
│ 2   │ red   │ red    │
│ 3   │ green │ purple │

То же самое происходит и со столбцами, поэтому, если бы вы сказали, что установите DataFrame, как указано выше, но используйте B = A, прежде чем я включу оба в кадр данных, тогда, еслизначения в одном столбце изменяются, другой также автоматически изменяется.

Мне это кажется странным, и, возможно, это особенность других языков программирования, но я много раз делал то же самое, что и выше в R, когдасоздавая резервную копию таблицы данных или обмениваясь данными между столбцами, никогда не сталкивался с этой проблемой.Таким образом, вопрос в том, работает ли он так, как задумано, и есть ли правильный способ копирования значений между фреймами данных?

Я использую версию Julia 0.7.0, так как я изначально установил 1.0.0 через репозиторий Manjaro и имелпроблемы с Is_windows() при попытке собрать Tk.

1 Ответ

0 голосов
/ 23 сентября 2018

Команда y = x не создает новый объект;он просто создает новую ссылку (или имя) для того же DataFrame.

. Вы можете создать копию, вызвав y = copy(x).В вашем случае это все еще не работает, так как он копирует только сам фрейм данных, но не переменные в нем.

Если вы хотите создать совершенно независимый новый объект, вы можете использовать y = deepcopy(x).В этом случае y не будет иметь ссылок на x.

См. Эту ветку для более подробного обсуждения:

https://discourse.julialang.org/t/what-is-the-difference-between-copy-and-deepcopy/3918/2

...