2017-03-14 83 views
1

當我運行下面的代碼時,我得到一個DataFrame與一個bool列和兩個double列。但是,當我將bool列作爲系列提取時,結果是一個Series對象,其類型爲DateTimefloat爲什麼Deedle將一個DataFrame布爾列轉換爲float系列?

它看起來像Deedle將該列「投」到另一個類型。

這是怎麼發生的?

open Deedle 
let dates = 
     [ DateTime(2013,1,1); 
     DateTime(2013,1,4); 
     DateTime(2013,1,8) ] 

let values = [ 10.0; 20.0; 30.0 ] 
let values2 = [ 0.0; -1.0; 1.0 ] 


let first = Series(dates, values) 
let second = Series(dates, values2) 
let third: Series<DateTime,bool> = Series.map (fun k v -> v > 0.0) second 

let df1 = Frame(["first"; "second"; "third"], [first; second; third]) 

let sb = df1.["third"] 

df1;; 
val it : Frame<DateTime,string> = 
    Deedle.Frame`2[System.DateTime,System.String] 
    {ColumnCount = 3; 
    ColumnIndex = Deedle.Indices.Linear.LinearIndex`1[System.String]; 
    ColumnKeys = seq ["first"; "second"; "third"]; 
    ColumnTypes = seq [System.Double; System.Double; System.Boolean]; 
    ... 

sb;; 
val it : Series<DateTime,float> = ... 

回答

2

由於現有的答案指出,GetColumn是要走的路。調用GetColumn時,您可以直接指定泛型參數,避免類型註釋使代碼更好:

let sb = df1.GetColumn<bool>("third") 

Deedle幀未靜態跟蹤類型的列的,所以當你想獲得一個列作爲一個打字的系列,你需要以某種方式指定類型。

我們不希望強制人們編寫類型註釋,因爲它們往往很長很醜,所以獲取列的主要方式是GetColumn,您可以在其中指定類型參數,如上例所示。

訪問列的其他方式,如df?thirddf.["third"]是速記是假設列類型是float因爲出現這種情況是很常見的情況(至少Deedle金融的最常見的用法),所以這兩個符號給你一個簡單的方法,「經常很好地工作」。

2

您可以使用.GetColumn提取系列爲bool:

let sb':(Series<DateTime,bool>) = df1.GetColumn("third") 
//val sb' : Series<DateTime,bool> = 
//series [ 2013/01/01 0:00:00 => False; 2013/01/04 0:00:00 => False; 2013/01/08 0:00:00 => True] 

至於你的爲什麼,我沒有看過源的問題,但我想索引的類型,你使用可能會返回一個obj,然後Deedle會試圖將其轉換爲某種東西,或者試圖將所有東西都轉換爲float

相關問題