是否有快速方法可以在Julia DataFrames上为sort
/ sort!
指定自定义订单?
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 │
我希望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 │
有没有办法在不分配内存的情况下执行此操作,因为在我的实际示例中,df
非常大?
答案 0 :(得分:4)
您可以定义比较功能:
lmhlt(x, y) = x == :low && y != :low || x == :med && y == :high
然后使用
sort!(df, lt=lmhlt)
然而,这仍然分配内存。它应该小于你当前的版本。
答案 1 :(得分:0)
我将a function to generalize custom sorting写入多个列,只为每个需要排序自定义顺序的列指定:
?customSort!
使用sort!()
该函数在内部使用by
DataFrames函数,其OrderedDict
关键字基于用户提供的自定义订单构建的>>> re.findall('[A-Za-z]+', 'This is my area!')
['This', 'is', 'my', 'area']
>>> re.findall('[[A-Z][a-z]]+', 'This is my area!')
[]
,用户Tamas_Papp {{3}建议}}。