了解julia DataFrames.select()中冒号的行为

了解julia DataFrames.select()中冒号的行为,dataframe,julia,Dataframe,Julia,我有一些数据有许多行,我想重新排序,在某些情况下重命名。由于列的数量太多,我不想选择并重命名其中的每一列。但是当我使用:操作符来选择其余的列时,我得到了一个我没有预料到的结果。我重命名的列包含两次: julia> data = [2 1 3 50 52 51 53 100] julia> names = ["col 2","col 1", "col_3", "col_50&qu

我有一些数据有许多行,我想重新排序,在某些情况下重命名。由于列的数量太多,我不想选择
并重命名其中的每一列。但是当我使用
操作符来选择其余的列时,我得到了一个我没有预料到的结果。我重命名的列包含两次:

julia> data = [2  1  3  50
               52 51 53 100]

julia> names = ["col 2","col 1", "col_3", "col_50"]

julia> df = DataFrame(data, names)
2×4 DataFrame
 Row │ col 2  col 1  col_3  col_50 
     │ Int64  Int64  Int64  Int64  
─────┼─────────────────────────────
   1 │     2      1      3      50
   2 │    52     51     53     100


julia> select(df, "col 1" => :col_1, "col 2" => :col_2, :)
2×6 DataFrame
 Row │ col_1  col_2  col 1  col 2  col_3  col_50 
     │ Int64  Int64  Int64  Int64  Int64  Int64  
─────┼───────────────────────────────────────────
   1 │     1      2      1      2      3      50
   2 │    51     52     51     52     53     100
我希望/期待着这个

julia> select(df, "col 1" => :col_1, "col 2" => :col_2, :)
2×6 DataFrame
 Row │ col_1  col_2  col_3  col_50 
     │ Int64  Int64  Int64  Int64  
─────┼────────────────────────────
   1 │     1      2      3      50
   2 │    51     52     53     100
关于
操作符,我误解了什么。
有没有其他方法可以实现我想要的转变?

事实证明是有的。有趣的是,人们(我在这里回答我自己的问题)可以专注于使用一个函数,而我可以使用
重命名!()
然后使用
选择对其重新排序!()

或使用管道:

julia> using Pipe

julia> @pipe df |>
        rename!(_, "col 1" => :col_1, "col 2" => :col_2) |> 
        select!(_, :col_1, :col_2, :)
2×4 DataFrame
│ Row │ col_1 │ col_2 │ col_3 │ col_50 │
│     │ Int64 │ Int64 │ Int64 │ Int64  │
├─────┼───────┼───────┼───────┼────────┤
│ 1   │ 1     │ 2     │ 3     │ 50     │
│ 2   │ 51    │ 52    │ 53    │ 100    │

关于
操作员的行为,我必须感谢bkamins在

在以下位置添加:放置源数据框中尚未添加到结果的所有列;添加基于列名(而不是内容)

为什么它是这样工作的: 通常,我们允许在select等中进行可能非常复杂的转换-可以按任何顺序创建、重命名和添加列。为了保持规则的简单性(以便用户可以建立正确的心理模型来了解正在发生的事情,而不会发生太多的神奇事情),这种方法是从左到右处理列,并通过在目标数据框中的名称来识别列

<>我同意,在你的特定情况下,最好按照你的建议去做,但是如果你考虑一个更广泛的上下文(即在一个选择中你可以有几十个不同的转换组合),保持规则一致而没有任何特殊的情况,我相信更好。
我想我也在这里分享它。

作为一个小评论
rename
rename只更改列的名称-它们不更改顺序。啊,对不起。。。我纠正了它。
julia> using Pipe

julia> @pipe df |>
        rename!(_, "col 1" => :col_1, "col 2" => :col_2) |> 
        select!(_, :col_1, :col_2, :)
2×4 DataFrame
│ Row │ col_1 │ col_2 │ col_3 │ col_50 │
│     │ Int64 │ Int64 │ Int64 │ Int64  │
├─────┼───────┼───────┼───────┼────────┤
│ 1   │ 1     │ 2     │ 3     │ 50     │
│ 2   │ 51    │ 52    │ 53    │ 100    │