Чтение CSV-файла в цикле Dataframe (Юлия) - PullRequest
1 голос
/ 29 октября 2019

Я хочу прочитать несколько файлов CSV с изменяющимися именами, такими как "CSV_1.csv" и так далее. Моя идея состояла в том, чтобы просто реализовать цикл, подобный следующему

using CSV
for i = 1:8
    a[i] = CSV.read("0.$i.csv")
end

, но, очевидно, это не сработает. Есть ли простой способ реализовать это, например, ввести дополнительное измерение в фрейм данных?

Ответы [ 2 ]

1 голос
/ 29 октября 2019

В качестве альтернативы тому, что предложил Кевин, можно написать:

# read in the files into a vector
a = CSV.read.(["0.$i.csv" for i in 1:8])

# add an indicator column
for i in 1:8
    a[i][!, :id] .= i
end

# create a single data frame with indicator column holding the source
b = reduce(vcat, a)
1 голос
/ 29 октября 2019

Предполагая, что a в данном случае является массивом, это определенно возможно, но для этого нужно предварительно выделить массив, поскольку вы не можете назначить несуществующий индекспока:

julia> a = []
0-element Array{Any,1}

julia> a[1] = 1
ERROR: BoundsError: attempt to access 0-element Array{Any,1} at index [1]
Stacktrace:
 [1] setindex!(::Array{Any,1}, ::Any, ::Int64) at ./essentials.jl:455
 [2] top-level scope at REPL[10]:1

julia> a2 = Vector{Int}(undef, 5);

julia> for i in 1:5
           a2[i] = i
       end

julia> a2
5-element Array{Int64,1}:
 1
 2
 3
 4
 5

В качестве альтернативы, вы можете использовать push!() для добавления объектов в массив по мере необходимости.

julia> a3 = [];

julia> for i in 1:5
           push!(a3, i)
       end

julia> a3
5-element Array{Any,1}:
 1
 2
 3
 4
 5

Так что для ваших файлов CSV,

using CSV

a = []

for i = 1:8
    push!(a, CSV.read("0.$i.csv"))
end
...