1

我有一个看起来像这样的Deedle数据框。

val it : Frame<int,string> =
          Date                        size1 size2 
13     -> 2013-12-12T00:00:00.103336Z 133   35    
14     -> 2013-12-12T00:00:00.105184Z 83    35    
15     -> 2013-12-12T00:00:00.107205Z 83    35    
16     -> 2013-12-12T00:00:00.109566Z 83    34    
17     -> 2013-12-12T00:00:00.115260Z 83    34    
18     -> 2013-12-12T00:00:00.133546Z 83    34    
20     -> 2013-12-12T00:00:00.138204Z 82    34    
22     -> 2013-12-12T00:00:00.140125Z 81    34 

我想删除 size1 和 size2 与前一行具有相同值行。在伪代码...

if row?size1 = prevRow?size1 && row?size2 = prevRow?size2 then dropRow

所以在上面的例子中,我最终会得到:

val it : Frame<int,string> =
          Date                        size1 size2 
13     -> 2013-12-12T00:00:00.103336Z 133   35    
14     -> 2013-12-12T00:00:00.105184Z 83    35    
16     -> 2013-12-12T00:00:00.109566Z 83    34    
20     -> 2013-12-12T00:00:00.138204Z 82    34    
22     -> 2013-12-12T00:00:00.140125Z 81    34 

我相信我想使用

Frame.filterRowValues(row - > )

但我看不到如何将一行与前一行进行比较。有没有一种简单的方法可以做到这一点?也许我需要转移并加入?

4

1 回答 1

3

这可以通过多种方式完成,我不太确定哪种方式最好:

  • 使用 shift 和 join (如您所说)肯定会起作用 - 您需要重命名其中一个框架中的列,以便您可以加入它们,但这对我来说听起来是一个很好的解决方案

  • 您可以使用frame.Rows |> Series.pairwise来获取包含当前行和上一行的元组,然后使用Series.filterand Series.map(从元组中选择第二行)并使用Frame.ofRows. 唯一的问题是,您总是会以这种方式丢失第一行(并且您必须将其添加回来)。

  • 您可以使用Frame.filter并找到上一行。最近的版本支持Lookup.Smaller让您轻松做到这一点。

第三个选项的代码如下所示(请注意,需要对框架行进行排序frame.Rows.IsOrdered = true)才能使其工作:

frame |> Frame.filterRows (fun k row ->
  let prev = frame.Rows |> Series.tryLookup k Lookup.Smaller // New in v1.0
  match prev with 
  | Some prev -> prev?Something <> row?Something
  | _ -> true (* always return true for the first row *) )
于 2014-05-24T12:43:27.030 回答