Как фильтровать данные из CSV на основе значения столбца - PullRequest
2 голосов
/ 07 мая 2020

Я пытался отфильтровать набор данных из 100 точек входа на основе значения первого столбца в наборе данных, чтобы создать две отдельные переменные с моими данными.

Значения фильтруются на основе ноль или 1, а затем я хочу сохранить остальные данные без нуля или единицы из первого столбца. Пока я пробовал следующий код, но, похоже, он работает не очень хорошо.

data1 = zeros(50,2)
data2 = zeros(50,2)

index1 = 0
index2 = 0

for i in 1:100    
    if data[i,1] < 0.5
        data1[index1] = data[i, 2:3]
        index+=1
    else 
        data2[index2] = data[i, 2:3]
        index2+=1
    end
end

Единственное, что я получаю, это ошибка, которую я не могу понять

MethodError: Cannot `convert` an object of type DataFrames.DataFrameRow{DataFrames.DataFrame,DataFrames.SubIndex{DataFrames.Index,UnitRange{Int64},UnitRange{Int64}}} to an object of type Float64
Closest candidates are:
  convert(::Type{T}, !Matched::T) where T<:Number at number.jl:6
  convert(::Type{T}, !Matched::Number) where T<:Number at number.jl:7
  convert(::Type{T}, !Matched::Base.TwicePrecision) where T<:Number at twiceprecision.jl:250
  ...

Stacktrace:
 [1] setindex!(::Array{Float64,2}, ::DataFrames.DataFrameRow{DataFrames.DataFrame,DataFrames.SubIndex{DataFrames.Index,UnitRange{Int64},UnitRange{Int64}}}, ::Int64) at .\array.jl:825
 [2] top-level scope at .\In[47]:9

1 Ответ

1 голос
/ 07 мая 2020

Давайте воспользуемся функцией groupby из DataFrames.jl, которая является текущим значением по умолчанию для CSV.read. В будущем вы можете использовать CSV.File, а затем собрать его в DataFrame или Matrix по своему усмотрению.

# get groups based off the first column
groups = groupby(data, 1)
gcol = groupcol(groups)
# for each group, drop that column and collect into a DataFrame
# could easily collect into a Matrix, too!
data1, data2 = [DataFrame(g[!, Not(gcol)]) for g in groups]

РЕДАКТИРОВАТЬ: на основе комментариев Богумила я обновил решение использовать современные лучшие практики!

...