Deedle Frame 中基于简单键的查找

Simple key based lookups in Deedle Frame

假设我们有如下数据:

name        age   eats
bugs bunny  20    carrots
elmer fudd  50    wabbits

以下 Pandas 示例的 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-sharpy 的方法来进行这些类型的查找(例如使用记录),那也会非常有用。

谢谢。

[编辑] 我想使用记录如下:

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 进行相同的操作。

Deedle 具有行和列键的概念 - 这使得基于键执行查找变得非常容易,但是对于基于其他 columns/rows 的查找,您需要使用过滤。

鉴于您的示例数据:

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

一旦你说查找,等效的数据结构就变成了map/dictionary。然后你可以做一个地图的地图,或者在这种情况下保持简单,记录的地图。当然,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"]