Deedle、F#和Frame.map的问题

Deedle、F#和Frame.map的问题,f#,deedle,F#,Deedle,我在理解Frame.map的签名(最终还有其他签名)时遇到了一个问题,因为我可以很容易地理解Series.map 这里有一个简单的例子: let ts1 = series [ ("A", "A1", "p1") => 0.5 ("A", "A1", "p2") => 2. ("A", "A2", "p3") => 2. ("A", "A2", "p4") => 0.5 ] let ts2 = series [ (

我在理解Frame.map的签名(最终还有其他签名)时遇到了一个问题,因为我可以很容易地理解Series.map

这里有一个简单的例子:

let ts1 = 
  series
   [ ("A", "A1", "p1") => 0.5 
     ("A", "A1", "p2") => 2.
     ("A", "A2", "p3") => 2. 
     ("A", "A2", "p4") => 0.5 ]

let ts2 = 
  series
   [ ("A", "A1", "p1") => "A"
     ("A", "A1", "p2") => "B"
     ("A", "A2", "p3") => "C"
     ("A", "A2", "p4") => "D" ]

let F = ["ts1" =?> ts1 ; "ts2" =?> ts2] |> Frame.ofColumns
ts1 |> Series.map (fun _ v -> v * 2.)
假设我想在ts1系列上应用一个函数,没有问题:

let ts1 = 
  series
   [ ("A", "A1", "p1") => 0.5 
     ("A", "A1", "p2") => 2.
     ("A", "A2", "p3") => 2. 
     ("A", "A2", "p4") => 0.5 ]

let ts2 = 
  series
   [ ("A", "A1", "p1") => "A"
     ("A", "A1", "p2") => "B"
     ("A", "A2", "p3") => "C"
     ("A", "A2", "p4") => "D" ]

let F = ["ts1" =?> ts1 ; "ts2" =?> ts2] |> Frame.ofColumns
ts1 |> Series.map (fun _ v -> v * 2.)
工作如预期

但是如果我想使用,让我们举个例子:

let fun1 (a: float) (b: string) =
    match b with
    |"B" -> a ** 2.
    |"C" -> a ** 3.
    |_   -> 0.
在相框上,我能猜出来。我试着给专栏打电话

我不介意一些帮助,因为我无法通过以前的帖子/Deedle doc/等来理解它。。。我只是被签名绊住了

let F2 = F |> Frame.mapRows (fun k a -> (fun1 a.GetAs<float>("ts1") a.GetAs<string>("ts2")))
让F2=F |>Frame.mapRows(funka->(fun1a.GetAs(“ts1”)a.GetAs(“ts2”))

这种操作在MATLAB/R/Python中使用矢量化索引非常直观

在Deedle中,
Frame.mapRows
将以
ObjectSeries
的形式获取每一行。我丑陋的解决方案是这样的

F
|> Frame.mapRows(fun _ v -> 
  match string v.["ts2"] with
  | "B" -> v |> Series.map(fun k v -> if k = "ts1" then box((unbox v) * 2.) else v)
  | "C" -> v |> Series.map(fun k v -> if k = "ts1" then box((unbox v) * 3.) else v)
  | _ -> v |> Series.map(fun k v -> if k = "ts1" then box(0.) else v)
)
|> Frame.ofRows

谢谢zyzhu,但我确实很好奇是否有更好的信息,我不喜欢这个解决方案的事实是,我想使用更复杂的函数和/或传递参数。