Как загрузить несколько файлов CSV в DataFrames в Julia? - PullRequest
3 голосов
/ 16 июня 2020

Я уже знаю, как загрузить один CSV-файл в DataFrame:

using CSV
using DataFrames    
df = DataFrame(CSV.File("C:\\Users\\username\\Table_01.csv"))

Как мне это сделать, если у меня есть несколько файлов CSV, например Table_01.csv, Table_02.csv, Table_03.csv? Могу ли я создать кучу пустых фреймов данных и использовать для их заполнения l oop? Или в Юлии есть способ попроще? Заранее большое спасибо!

Ответы [ 3 ]

3 голосов
/ 16 июня 2020

Если вам нужно несколько кадров данных (а не один кадр данных, содержащий данные из нескольких файлов), есть несколько вариантов.

Позвольте мне начать с простейшего подхода с использованием широковещательной передачи:

dfs = DataFrame.(CSV.File.(["Table_01.csv", "Table_02.csv", "Table_03.csv"]))

или

dfs = @. DataFrame(CSV.File(["Table_01.csv", "Table_02.csv", "Table_03.csv"]))

или (с некоторыми более сложными вещами, с использованием композиции функций):

(DataFrame∘CSV.File).(["Table_01.csv", "Table_02.csv", "Table_03.csv"])

или с использованием цепочки:

CSV.File.(["Table_01.csv", "Table_02.csv", "Table_03.csv"]) .|> DataFrame

Теперь другие варианты: map, как было предложено в комментарии:

map(DataFrame∘CSV.File, ["Table_01.csv", "Table_02.csv", "Table_03.csv"])

или просто используйте понимание:

[DataFrame(CSV.File(f)) for f in ["Table_01.csv", "Table_02.csv", "Table_03.csv"]]

(я перечисляю варианты, чтобы показать разные синтаксисы c возможности в Юлии)

1 голос
/ 28 июля 2020

Простое решение, при котором вам не нужно явно вводить имена файлов:

using CSV, Glob, DataFrames
path = raw"C:\..." # directory of your files (raw is useful in Windows to add a \)
files=glob("*.csv", path) # to load all CSVs from a folder (* means arbitrary pattern)
dfs = DataFrame.( CSV.File.( files ) ) # creates a list of dataframes

# add an index column to be able to later discern the different sources
for i in 1:length(dfs)
    dfs[i][!, :sample] .= i # I called the new col sample
end

# finally, if you want, reduce your collection of dfs via vertical concatenation
df = reduce(vcat, dfs)
1 голос
/ 16 июня 2020

Вот как я это сделал, но может быть способ попроще.

using DataFrames, Glob
import CSV

function readcsvs(path)
    files=glob("*.csv", path) #Vector of filenames. Glob allows you to use the asterisk.
    numfiles=length(files)    #Number of files to read.
    tempdfs=Vector{DataFrame}(undef, numfiles) #Create a vector of empty dataframes.
    for i in 1:numfiles
        tempdfs[i]=CSV.read(files[i]) #Read each CSV into its own dataframe.
    end
    masterdf=outerjoin(tempdfs..., on="Column In Common") #Join the temporary dataframes into one dataframe.
end
...