F#:如何仅在Deedle数据框的某些特定列上运行fillMissing

时间:2016-05-09 00:35:07

标签: f# deedle

在两个数据帧的外连接之后,我得到的结果数据帧f现在包含列A,B,C和D,它们都有缺失值。我想使用fillMissing填写缺失的值,但仅限于C和D列。

3 个答案:

答案 0 :(得分:2)

我已经找到了两种方法来实现这一点,但两者都不是特别漂亮。我想知道是否有更好的功能方法来做到这一点。

方法1(变异):

fr
|> fun f -> 
    f?C <- f?C |> Series.fillMissing Direction.Forward
    f?D <- f?D |> Series.fillMissing Direction.Forward
    f
|> ...further processing...`

方法2(功能但丑陋):

fr 
|> Frame.mapCols 
    (fun k v -> match k with 
                | "C" | "D" -> v |> Series.fillMissing Direction.Forward 
                | _         -> v.As<obj>() )
|> ...further processing...

我希望得到一些关于是否有更好方法的意见。

编辑:我刚刚在我正在使用的实际数据框架(~70K行)上运行了三种方法(方法3是Foggy Finder的基于合并的方法),并得到以下结果:

Method 1: Real: 00:00:00.003, CPU: 00:00:00.000, GC gen0: 0, gen1: 0, gen2: 0    
Method 2: Real: 00:00:00.236, CPU: 00:00:00.234, GC gen0: 9, gen1: 3, gen2: 1    
Method 3: Real: 00:00:00.151, CPU: 00:00:00.156, GC gen0: 20, gen1: 1, gen2: 0

答案 1 :(得分:1)

我不认为这个选项更好,但仍有可能:

f
|> Frame.expandCols [| "A"; "B" |]
|> Frame.fillMissing Direction.Forward
|> Frame.merge (Frame.expandCols [| "C"; "D" |] f)
|> ...further processing...

答案 2 :(得分:1)

这就是我在处理类似情况的一个函数中的做法。您可以在此之后根据需要对列进行排序。

let frame1 =
    rawFrame
    |> Frame.sliceCols ["C";"D"]
    |> Frame.fillMissing Direction.Forward
    |> Frame.dropSparseRows
// Left join with the other two columns
let frame2 = rawFrame |> Frame.sliceCols ["A";"B"]
frame1.Join(frame2, kind = JoinKind.Left)