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"]
假设我们有如下数据:
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"]