F# 删除Deedle dataframe中与上一行几乎重复的行
我有一个Deedle数据框,看起来像这样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
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 *) )