F# 删除Deedle dataframe中与上一行几乎重复的行

F# 删除Deedle dataframe中与上一行几乎重复的行,f#,dataframe,f#-data,deedle,F#,Dataframe,F# Data,Deedle,我有一个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.10

我有一个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 
因此,在上面的示例中,我将得出以下结论:

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 

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

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

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

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

  • 您可以使用
    Frame.filter
    查找上一行。最新版本支持
    Lookup.small
    ,这让您可以轻松地进行查找

第三个选项的代码如下所示(请注意,需要对帧行进行排序
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 *) )
frame |>frame.filterRows(趣味k行->
让prev=frame.Rows |>Series.tryLookup k Lookup.small//在v1.0中新增
匹配上一个
|一些上一个->上一个?一些行?一些
|->true(*始终为第一行返回true*)

我应该提到的是,机架没有订购。问题是,数据已经按照日期排序,但是有重复的日期,因此排序失败,出现重复的键errorAh,但是如果索引是整数,那么它将被排序(在示例输出中就是这种情况)。您可以使用
Frame.indexrow或dinaldy
(它用递增的、有序的整数替换当前索引)来确保这种情况。这样行吗?
Frame.filterRowValues(row - > )
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 *) )