2016-08-22 60 views
2

基於查找假設我們有一些數據如下:簡單的按鍵在Deedle框架

name  age eats 
bugs bunny 20 carrots 
elmer fudd 50 wabbits 

什麼是Deedle相當於下面的熊貓例子?

>>> df[df["name"] == "bugs bunny"]["eats"] 
0 carrots 
Name: eats, dtype: object 

>>> df[df["eats"] == "carrots"]["name"] 
0 bugs bunny 
Name: name, dtype: object 

如果有另一個更F-夏氏的方式做這些類型的查詢(如使用記錄),這也將是非常有用的。

謝謝。

[編輯] 我猜使用記錄,這將是如下:

type PersonRec = {name : string; age : int ; eats : string} 
let rec1 = { name = "bugs bunny"; age = 20; eats = "carrots" } 
let rec2 = { name = "elmer fudd"; age = 50; eats = "wabbits" } 

let bugsbunnyeats = 
    [rec1; rec2] 
    |> List.filter (function 
         | {name = "bugs bunny"} -> true 
         | _      -> false 
        ) 
bugsbunnyeats.Head.eats 

但我還是想看看是否有可能使用Deedle相同的操作。

回答

3

Deedle具有行&列鍵的概念 - 這使得基於鍵執行查找變得非常容易,但是對於基於其他列/行的查找,您需要使用過濾。

鑑於您的樣本數據:

let df = 
    frame [ 
    "age" =?> series [ "bugs bunny" => 20; "elmer fudd" => 50 ] 
    "eats" =?> series [ "bugs bunny" => "carrots"; "elmer fudd" => "wabbits" ] ] 

這將創建一個框架:

   age eats  
bugs bunny -> 20 carrots 
elmer fudd -> 50 wabbits 

現在你可以使用各種查詢:一旦你說查找

// Lookup using column & row keys 
df.["eats", "bugs bunny"] 

// Lookup using row key 
df.Rows.["bugs bunny"].GetAs<int>("age") 
df.Rows.["bugs bunny"]?age // for numbers 

// Lookup using filtering 
let carrotEaters = 
    df.Rows 
    |> Series.filter (fun k row -> row.GetAs("eats") = "carrots") 

carrotEaters.FirstKey() // bugs bunny 
carrotEaters.FirstValue().GetAs<int>("age") // 20 
+0

非常不錯的索引索引總結!爲了使這些工作從記錄中得到索引:'let df = recs |> Frame.ofRecords |> Frame.indexRowsString「Name」' – s952163

2

,等效數據結構變成地圖/字典。然後你可以做一張地圖的地圖,或者在這種情況下保持簡單的記錄地圖。當然Deedle將抽象的最這一點,但在這裏它是一個地圖:

type PersonRec = {Name : string; Age : int ; Eats : string} 
let rec1 = { Name = "bugs bunny"; Age = 20; Eats = "carrots" } 
let rec2 = { Name = "elmer fudd"; Age = 50; Eats = "wabbits" } 
let recs = [rec1;rec2] 
type subRec = {Age: int; Eats:string} 

創建一個簡單的地圖:

let m1 = Map.empty<string,(int * string)> 
let m1 = recs |> List.map (fun x -> (x.Name,{subRec.Age=x.Age;subRec.Eats = x.Eats})) 
       |> Map.ofList 

m1.["bugs bunny"].Eats 
//val it : string = "carrots"` 

而且誰吃胡蘿蔔?

m1 |> Seq.filter (fun (KeyValue (k,v))-> v.Eats ="carrots") 
    |> Seq.map (fun x -> x.Key) 
//val it : seq<string> = seq ["bugs bunny"]