在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])
答案 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关于构造数据框的便捷方法。