如何在Julia中按多个列对数据框进行排序

时间:2019-11-18 16:49:04

标签: julia

我想按多列对数据框进行排序。这是我制作的一个简单数据框。如何按不同的排序类型对每一列进行排序?

using DataFrames

DataFrame(b = ("Hi", "Med", "Hi", "Low"),
      levels = ("Med", "Hi", "Low"),
      x = ("A", "E", "I", "O"), y = (6, 3, 7, 2),
      z = (2, 1, 1, 2))

here移植过来。

2 个答案:

答案 0 :(得分:2)

您的代码正在创建包含元组的单行DataFrame,因此我进行了更正。 请注意,对于名义变量,通常应使用Symbol而不是String

using DataFrames
df = DataFrame(b = [:Hi, :Med, :Hi, :Low, :Hi],
               x = ["A", "E", "I", "O","A"], 
               y = [6, 3, 7, 2, 1],
               z = [2, 1, 1, 2, 2])

sort(df, [:z,:y])

答案 1 :(得分:2)

与R不同,Julia的DataFrame构造函数期望每列中的值作为矢量而不是作为元组传递:因此DataFrame(b = ["Hi", "Med", "Hi", "Low"],&tc。

此外,DataFrames也不希望以R的方式给出明确的级别。而是可以使用可选的关键字参数categorical,并将其设置为“ Bool的向量,指示应将哪些列转换为CategoricalVector”。

(添加了DataFrame和CategoricalArrays包之后)


julia> using DataFrames, CategoricalArrays

julia> xyorz = categorical(rand(("x","y","z"), 5))
5-element CategoricalArray{String,1,UInt32}:
 "z"
 "y"
 "x"
 "x"
 "z"

julia> smallints = rand(1:4, 5)
5-element Array{Int64,1}:
 2
 3
 2
 1
 1

julia> df = DataFrame(A = 1:5, B = xyorz, C = smallints)
5×3 DataFrame
│ Row │ A     │ B            │ C     │
│     │ Int64 │ Categorical… │ Int64 │
├─────┼───────┼──────────────┼───────┤
│ 1   │ 1     │ z            │ 2     │
│ 2   │ 2     │ y            │ 3     │
│ 3   │ 3     │ x            │ 2     │
│ 4   │ 4     │ x            │ 1     │
│ 5   │ 5     │ z            │ 1     │

现在,您要排序什么? A上(B然后C)? [4, 3, 2, 5, 1]

julia> sort(df, (:B, :C))
5×3 DataFrame
│ Row │ A     │ B            │ C     │
│     │ Int64 │ Categorical… │ Int64 │
├─────┼───────┼──────────────┼───────┤
│ 1   │ 4     │ x            │ 1     │
│ 2   │ 3     │ x            │ 2     │
│ 3   │ 2     │ y            │ 3     │
│ 4   │ 5     │ z            │ 1     │
│ 5   │ 1     │ z            │ 2     │

julia> sort(df, (:B, :C)).A
5-element Array{Int64,1}:
 4
 3
 2
 5
 1

这是开始http://juliadata.github.io/DataFrames.jl/stable/

的好地方