2017-04-07 67 views
2

在Julia中構建新的DataFrame時,renamerename!之間是否有區別?我相信一般修改現有的DataFramerename!是理想的,因爲它修改了它的參數而不在內存中生成新的對象。重命名之間的區別!並在Julia中重新命名爲新的DataFrame?

但由於內存中沒有對象,因此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]) 

回答

3

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關於構造數據框的便捷方法。