2016-08-22 1 views
2

Angenommen, wir einige Daten wie folgt:Einfache Schlüssel basiert Lookups in Deedle Rahmen

name  age eats 
bugs bunny 20 carrots 
elmer fudd 50 wabbits 

Was die Deedle Äquivalent der folgenden Pandas Beispiel ist?

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

oder

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

Wenn es eine andere mehr F-sharpy Art und Weise, diese Art von Lookups (zum Beispiel unter Verwendung von Datensatz) zu tun, die auch sehr nützlich sein würden.

Danke.

[EDIT] ich Aufzeichnungen denke mit, es wäre wie folgt:

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 

Aber ich würde immer noch die gleiche Operation wie wenn möglich mit Deedle zu sehen.

Antwort

3

Deedle hat das Konzept der Zeile & Spaltenschlüssel - das macht es super einfach, Lookup basierend auf dem Schlüssel durchzuführen, aber für die Suche basierend auf anderen Spalten/Zeilen, müssen Sie Filterung verwenden.

Ihre Beispieldaten Gegeben:

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

Jetzt können Sie verschiedene Lookups verwenden:

// 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

Sehr schöne Zusammenfassung der Indizierung zu Deedle! Dazu müssen die Zeilen indiziert werden: 'let df = recs |> Frame.ofRecords |> Frame.indexRowsString" Name "' – s952163

2

Sobald Sie Lookup sagen, die äquivalente Daten

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

Dieser einen Rahmen schafft Struktur wird zu einer Karte/einem Wörterbuch. Dann können Sie eine Karte von Karten erstellen, oder einfach in diesem Fall, Karte von Datensätzen, einfach halten. Natürlich Deedle wird abstrakt die meisten dieser aber hier ist es für eine Karte:

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} 

eine einfache Karte erstellen:

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

Und wer isst Möhren?

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