是否有指定自定义为了一个快速的方法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是非常大的?
您可以定义一个比较函数:
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)
然而,这仍然分配内存。不过它应该低于您当前的版本。