#julia #dataframes.jl
Вопрос:
Постановка проблемы : удаление строки из подкадра данных
Код:
x=[rand(3) for i in 1:3]
dfx=DataFrame(x,:auto)
dfy=@view dfx[2:3,:]
Вопрос: Я хочу удалить первую строку из dfy, чтобы она тоже была удалена из dfx.
Я делаю подмножество исходного dfx, чтобы выполнить дальнейшую проверку подмножеств строк, если они соответствуют условиям. В конце я хочу решить, сохранить строку в dfx или удалить ее. Я работаю с подмножеством dfx, которое является dfy.
Ответ №1:
Вам не разрешается выполнять удаление строк в представлениях. Вот один пример, показывающий, почему это было бы проблематично:
julia> using DataFrames
julia> df = DataFrame(a=1:3)
dfv = 3×1 DataFrame
Row │ a
│ Int64
─────┼───────
1 │ 1
2 │ 2
3 │ 3
julia> dfv = view(df, [1, 1, 1, 1], :)
4×1 SubDataFrame
Row │ a
│ Int64
─────┼───────
1 │ 1
2 │ 1
3 │ 1
4 │ 1
а теперь предположим, что вы хотите удалить строки 2 и 3 из dfv
представления, но вы не можете удалить строку из родительского элемента дважды, а также после такого удаления, каково будет состояние dfv
?
Я делаю подмножество исходного dfx, чтобы выполнить дальнейшую проверку подмножеств строк, если они соответствуют условиям.
Обратите внимание, что вы можете использовать parentindices
функцию для получения индексов в родительском представлении, чтобы позже удалить соответствующие строки из родительского представления.
Редактировать
Пример:
julia> x=[rand(3) for i in 1:3]
3-element Vector{Vector{Float64}}:
[0.9362990387940191, 0.872386665989372, 0.9062520245175714]
[0.31161625031197393, 0.21614040488877717, 0.7277794414244152]
[0.35548885964798926, 0.4422493896149622, 0.45150837090448315]
julia> dfx=DataFrame(x, :auto)
3×3 DataFrame
Row │ x1 x2 x3
│ Float64 Float64 Float64
─────┼──────────────────────────────
1 │ 0.936299 0.311616 0.355489
2 │ 0.872387 0.21614 0.442249
3 │ 0.906252 0.727779 0.451508
julia> dfy=@view dfx[2:3, :]
2×3 SubDataFrame
Row │ x1 x2 x3
│ Float64 Float64 Float64
─────┼──────────────────────────────
1 │ 0.872387 0.21614 0.442249
2 │ 0.906252 0.727779 0.451508
julia> row_to_remove = parentindices(dfy)[1][1]
2
julia> delete!(dfx, row_to_remove)
2×3 DataFrame
Row │ x1 x2 x3
│ Float64 Float64 Float64
─────┼──────────────────────────────
1 │ 0.936299 0.311616 0.355489
2 │ 0.906252 0.727779 0.451508
Комментарии:
1. Я не могу найти в своей вселенной применения для вашего случая. Я предположил, что если я смогу косвенно редактировать значения с помощью dfv в df, то действие удаления как издание тоже будет работать. Ваш совет с родительскими советами отлично сработал для меня. Спасибо.
2. Но в целом другие разработчики хотят такого поведения, и это то, что поддерживается и разрешено в базе Julia для других представлений. У нас должен быть дизайн, поддерживающий все рабочие процессы, которые могут использовать пользователи. Также — как уже отмечалось — вашу проблему можно решить с помощью
parentindices
. Я добавлю пример, чтобы показать вам, как это делается.3. Ах — и простой пример использования, например, если вы хотите использовать начальную загрузку строк фрейма данных (например, вы строите некоторую прогностическую модель и хотите получить начальные доверительные интервалы для ее параметров). В таком случае вы ОЖИДАЕТЕ, что в представлении будут дублироваться строки.
4. Спасибо за помощь. Для меня это совершенно нормально.