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

F#:如何仅在数据帧的某些特定列上运行fillMissing,f#,deedle,F#,Deedle,在两个数据帧的外部联接之后,我得到了结果数据帧f,它现在包含列A、B、C和D,这些列中都缺少值。我想用fillMissing来填充缺失的值,但只针对C列和D列。我想出了两种方法来实现这一点,但这两种方法都不是特别漂亮。我想知道是否有更好的功能性方法来实现这一点 方法1(突变): 我不认为这个选项更好,但仍然有可能: f |> Frame.expandCols [| "A"; "B" |] |> Frame.fillMissing Direction.Forward |> Fra

在两个数据帧的外部联接之后,我得到了结果数据帧
f
,它现在包含列A、B、C和D,这些列中都缺少值。我想用
fillMissing
来填充缺失的值,但只针对C列和D列。

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

方法1(突变):
我不认为这个选项更好,但仍然有可能:

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

这就是我在处理类似情况的一项职能中所做的。在此之后,您可以根据需要对列进行排序

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)

@mt99,尽管如此,我还不能验证这个变体的正确性。所以,如果您测试它或向我展示MCVE,它会更好。不,它确实有效,尽管我并没有为
expandCols
而烦恼,因为在我的例子中,所有列都是浮点数。我最初关心的
merge
join
是效率,但是,它比方法2更好(参见上面问题的编辑)。有趣的结果我还认为M2应该更快。事实上,我编辑了答案。经过深思熟虑,答案中的方法的时间安排可能属于这里,所以我将保持原样。我同意(决定澄清)
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
f
|> Frame.expandCols [| "A"; "B" |]
|> Frame.fillMissing Direction.Forward
|> Frame.merge (Frame.expandCols [| "C"; "D" |] f)
|> ...further processing...
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)