2016-06-20 5 views
5

Julia DataFramesでカスタム注文をsort/sort!にする簡単な方法はありますか?Julia 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 │ 

私は:med:high続い:low最初に注文したy列を、持っていると思います。これを行う最善の方法は何でしょうか?私は次の操作を行うことができます知っている:

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は非常に大きいのですか?

答えて

4

あなたは比較関数を定義することができます。

lmhlt(x, y) = x == :low && y != :low || x == :med && y == :high 

するとしかし、これはまだメモリを割り当て

sort!(df, lt=lmhlt) 

を使用しています。それはあなたの現在のバージョンよりも小さくなるはずです。

+1

ニース!ありがとう!ここで 'lt'引数を完全に理解するには、[docs](http://docs.julialang.org/en/latest/stdlib/sort/)で検索しなければなりませんでした。彼らは言った: "すべての並べ替えと順序関連の関数は、操作される値の合計順序を定義する"より小さい "関係に依存します。デフォルトでisless関数が呼び出されますが、' lt 'キーワード。 –

0

私は、カスタムオーダーをソートする必要が列ごとに指定する複数の列にa function to generalize custom sortingを書いた:あなたはより多くの細部が一度?customSort!

を使用してパッケージをインストールして得ることができます

Pkg.clone("https://github.com/sylvaticus/LAJuliaUtils.jl.git") 
using DataFrames, LAJuliaUtils 
df = DataFrame(
    c1 = ['a','b','c','a','b','c'], 
    c2 = ["aa","aa","bb","bb","cc","cc"], 
    c3 = [1,2,3,10,20,30], 
) 
customSort!(df, [(:c2,["bb","cc"]),(:c1,['b','a','c'])]) 

6×3 DataFrames.DataFrame 
│ Row │ c1 │ c2 │ c3 │ 
├─────┼─────┼──────┼────┤ 
│ 1 │ 'a' │ "bb" │ 10 │ 
│ 2 │ 'c' │ "bb" │ 3 │ 
│ 3 │ 'b' │ "cc" │ 20 │ 
│ 4 │ 'c' │ "cc" │ 30 │ 
│ 5 │ 'b' │ "aa" │ 2 │ 
│ 6 │ 'a' │ "aa" │ 1 │ 

機能が内部sort!()を使用していますDataFramesはJulia DiscourseのユーザーTamas_Pappによって提案されているように、byキーワードがOrderedDict以上のユーザー提供のカスタム注文に基づいて構築されています。

関連する問題