2016-08-22 11 views
2

次のように我々はいくつかのデータを持っていると仮定します。シンプルなキーベースの検索は

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を使用して同じ操作を確認したいと思います:

[EDIT] 私は次のようになり、レコードを使用して推測します。

答えて

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

Deedleへのインデックス作成の要約!これをレコードから処理するには、行にインデックスを付ける必要があります: 'let df = recs |> Frame.ofRecords |> Frame.indexRowsString" Name "' – s952163

2

を構造は地図/辞書になります。そうすれば、マップのマップを作成することも、この場合は単純にレコードマップを作成することもできます。もちろんDeedle意志抽象的な本のほとんどが、ここで、それはマップのためです:

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"` 

とニンジンを食べる:

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} 

は、単純なマップを作成しますか?

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