DataFrames的一個很好的特性是,它可以存儲不同類型的列,它可以「自動識別」出來的,例如:如何混合型矩陣轉換爲數據幀中的朱莉婭承認列類型
using DataFrames, DataStructures
df1 = wsv"""
parName region forType value
vol AL broadL_highF 3.3055628012
vol AL con_highF 2.1360975151
vol AQ broadL_highF 5.81984502
vol AQ con_highF 8.1462998309
"""
typeof(df1[:parName])
DataArrays.DataArray{String,1}
typeof(df1[:value])
DataArrays.DataArray{Float64,1}
當我嘗試做不過來達到相同的結果從一開始矩陣(從電子表格導入)I「鬆」即自動轉換:
dataMatrix = [
"parName" "region" "forType" "value";
"vol" "AL" "broadL_highF" 3.3055628012;
"vol" "AL" "con_highF" 2.1360975151;
"vol" "AQ" "broadL_highF" 5.81984502;
"vol" "AQ" "con_highF" 8.1462998309;
]
h = [Symbol(c) for c in dataMatrix[1,:]]
vals = dataMatrix[2:end, :]
df2 = convert(DataFrame,OrderedDict(zip(h,[vals[:,i] for i in 1:size(vals,2)])))
typeof(df2[:parName])
DataArrays.DataArray{Any,1}
typeof(df2[:value])
DataArrays.DataArray{Any,1}
上有SO幾個問題關於如何將矩陣轉換爲數據框(例如DataFrame from Array with Header,Convert Julia array to dataframe),但沒有任何答案處理混合類型矩陣的轉換。
如何從矩陣自動識別列的類型創建一個數據框? (1)轉換df(使用字典或矩陣構造函數..第一個更快)然後應用try-catch進行類型轉換(我的原始答案); (2)轉換爲字符串,然後使用df.inlinetable(丹Getz答案); (3)檢查每個元素的類型和列的一致性(Alexander Morley答案)。
這些結果如下:
# second time for compilation.. further times ~ results
@time toDf1(m) # 0.000946 seconds (336 allocations: 19.811 KiB)
@time toDf2(m) # 0.000194 seconds (306 allocations: 17.406 KiB)
@time toDf3(m) # 0.001820 seconds (445 allocations: 35.297 KiB)
那麼,瘋狂的是,最有效的解決方案似乎是「倒出來的水」問題縮小到一個已經解決了一個;-)
謝謝你所有的答案。
你爲什麼不只是保存電子表格中的csv文件並使用CSV.read()加載它?這應該照顧它。 –
@ MichaelK.Borregaard,因爲我有一個模型可以加載來自多張工作表的所有設置和數據,並且我希望在每次進行更改時都避免將它們全部導出到CVS。 – Antonello