Джулия фрейм данных : Удаление строки из вложенного фрейма данных

#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. Спасибо за помощь. Для меня это совершенно нормально.