Julia DataFrames中的高效自定义排序?

tln*_*agy 5 dataframe julia

是否有指定自定义为了一个快速的方法sort/ sort!上朱莉娅DataFrames?

julia> using DataFrames

julia> srand(1);

julia> df = DataFrame(x = rand(10), y = rand([:high, :med, :low], 10))
10×2 DataFrames.DataFrame
? Row ? x          ? y    ?
???????????????????????????
? 1   ? 0.236033   ? med  ?
? 2   ? 0.346517   ? high ?
? 3   ? 0.312707   ? high ?
? 4   ? 0.00790928 ? med  ?
? 5   ? 0.488613   ? med  ?
? 6   ? 0.210968   ? med  ?
? 7   ? 0.951916   ? low  ?
? 8   ? 0.999905   ? low  ?
? 9   ? 0.251662   ? high ?
? 10  ? 0.986666   ? med  ?

julia> sort!(df, cols=[:y])
10×2 DataFrames.DataFrame
? Row ? x          ? y    ?
???????????????????????????
? 1   ? 0.346517   ? high ?
? 2   ? 0.312707   ? high ?
? 3   ? 0.251662   ? high ?
? 4   ? 0.951916   ? low  ?
? 5   ? 0.999905   ? low  ?
? 6   ? 0.236033   ? med  ?
? 7   ? 0.00790928 ? med  ?
? 8   ? 0.488613   ? med  ?
? 9   ? 0.210968   ? med  ?
? 10  ? 0.986666   ? med  ?
Run Code Online (Sandbox Code Playgroud)

我想首先y订购列:low,然后是:med:high.这样做的最佳方式是什么?我知道我可以做到以下几点:

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

julia> for val in [:low, :med, :high]
           push!(subdfs, df[df[:y] .== val, :])
       end

julia> vcat(subdfs...)
10×2 DataFrames.DataFrame
? Row ? x          ? y    ?
???????????????????????????
? 1   ? 0.951916   ? low  ?
? 2   ? 0.999905   ? low  ?
? 3   ? 0.236033   ? med  ?
? 4   ? 0.00790928 ? med  ?
? 5   ? 0.488613   ? med  ?
? 6   ? 0.210968   ? med  ?
? 7   ? 0.986666   ? med  ?
? 8   ? 0.346517   ? high ?
? 9   ? 0.312707   ? high ?
? 10  ? 0.251662   ? high ?
Run Code Online (Sandbox Code Playgroud)

有没有办法在不分配内存的情况下执行此操作,因为在我的实际示例中,它df是非常大的?

Fen*_*ang 4

您可以定义一个比较函数:

lmhlt(x, y) = x == :low && y != :low || x == :med && y == :high
Run Code Online (Sandbox Code Playgroud)

然后使用

sort!(df, lt=lmhlt)
Run Code Online (Sandbox Code Playgroud)

然而,这仍然分配内存。不过它应该低于您当前的版本。