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

时间:2016-06-20 22:42:02

标签: dataframe julia

是否有快速方法可以在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非常大?

2 个答案:

答案 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}建议}}。