重命名之间的区别!并在Julia中使用新的DataFrame重命名?

时间:2017-04-07 15:41:44

标签: dataframe rename julia

在Julia中构建新的rename时,rename!DataFrame之间是否有任何区别?我一般认为修改现有DataFrame rename!是理想的,因为它修改了它的参数而没有在内存中生成新对象。

但是由于内存中没有对象,rename似乎是合适的。

using DataFrames
df1 = rename( DataFrame(rand((100,2))), [:x1, :x2], [:x, :y])
df2 = rename!(DataFrame(rand((100,2))), [:x1, :x2], [:x, :y])

# Ideal formulation not using rename (currently no matching method)
df0 = DataFrame(rand((100,2)), [:x, :y])

1 个答案:

答案 0 :(得分:4)

rename!表单修改参数数据框,而rename版本使用新列名构造新数据框。由于您正在构建数据框,然后立即重命名其列,因此使用rename!更安全,更高效。如果存在对您不希望以可见方式修改的内部数据框的引用,那么您可能希望使用非变异rename函数。差异可以在这里看到:

julia> df0 = DataFrame(rand((3,2)))
3×2 DataFrames.DataFrame
│ Row │ x1       │ x2       │
├─────┼──────────┼──────────┤
│ 1   │ 0.625971 │ 0.401812 │
│ 2   │ 0.316224 │ 0.208431 │
│ 3   │ 0.331206 │ 0.466665 │

julia> df1 = rename(df0, [:x1, :x2], [:x, :y])
3×2 DataFrames.DataFrame
│ Row │ x        │ y        │
├─────┼──────────┼──────────┤
│ 1   │ 0.625971 │ 0.401812 │
│ 2   │ 0.316224 │ 0.208431 │
│ 3   │ 0.331206 │ 0.466665 │

julia> df0
3×2 DataFrames.DataFrame
│ Row │ x1       │ x2       │
├─────┼──────────┼──────────┤
│ 1   │ 0.625971 │ 0.401812 │
│ 2   │ 0.316224 │ 0.208431 │
│ 3   │ 0.331206 │ 0.466665 │

julia> df0 === df1
false

julia> df2 = rename!(df0, [:x1, :x2], [:x, :y])
3×2 DataFrames.DataFrame
│ Row │ x        │ y        │
├─────┼──────────┼──────────┤
│ 1   │ 0.625971 │ 0.401812 │
│ 2   │ 0.316224 │ 0.208431 │
│ 3   │ 0.331206 │ 0.466665 │

julia> df0
3×2 DataFrames.DataFrame
│ Row │ x        │ y        │
├─────┼──────────┼──────────┤
│ 1   │ 0.625971 │ 0.401812 │
│ 2   │ 0.316224 │ 0.208431 │
│ 3   │ 0.331206 │ 0.466665 │

julia> df0 === df2
true

rename返回的数据帧是一个具有不同列标签的新数据帧 - 即df1 !== df0 - 而rename!返回的数据帧与传入的数据帧相同列名称 - 即df1 === df0。您可能希望开始讨论Julia's Discourse forum关于构造数据框的便捷方法。