deedle aggregate / group基于Frame列中的运行数字

时间:2016-03-07 14:30:48

标签: f# aggregate deedle

说我有一个Frame,如下所示,

  "     Name    ID     Amount
0 -> Joe        51       50    
1 -> Tomas      52       100

2 -> Eve        65       20   

3 -> Suzanne    67       10 

4 -> Suassss    69       10 
5 -> Suzanne    70       10 

6 -> Suzanne    78       1 
7 -> Suzanne    79       10 
8 -> Suzanne    80       12

9 -> Suzanne    85       10 

10 -> Suzanne    87       10 
...

我想要实现的是在ID列上对基础进行分组或聚合,以便在遇到运行编号的序列时,应将这些行组合在一起,否则,行本身就是一个组。

1 个答案:

答案 0 :(得分:3)

我相信递归函数是你的朋友。

提供元组列表

let data = [(Joe, 51, 50);
            (Tomas, 52, 100);
            (Eve, 65, 20);
            (Suzanne, 67, 10)]

到函数

let groupBySequencialId list =
    let rec group result acc data lastId =
        match data with
        | [] -> acc :: result
        | (name, id, amount) :: tail ->
            if lastId + 1 = id then
                group result ((name, id, amount) :: acc) tail id
            else
                group (acc :: result) ([(name, id, amount)]) tail id

    group [] [] data 0

并且您将获得您正在寻找的结果。 Grouped result

这应该可以完成工作,除了三个警告。

  1. 您需要将字符串解析为所需的元组
  2. 结果集中有一个空列表,因为第一个递归不匹配,并将空累加器附加到结果集
  3. 该列表将被撤销
  4. 另请注意,这是一项高度专业化的功能。 如果我是你,如果你打算重复使用它,我会试着让它更通用。

    玩得开心。