долю совокупного/группы, основанные на побегушках в колонну рамы


Скажем, у меня есть 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 2

1 ответ:

Я полагаю, что рекурсивная функция-это ваш друг.

Скормите список кортежей

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

И вы получите результат, который вы ищете. Сгруппированный результат

Это должно сделать работу, за исключением трех предостережений.

  1. вам нужно разобрать строку на необходимые кортежи
  2. в результирующем наборе есть пустой список, потому что первая рекурсия не совпадает и добавляет пустой накопитель к результирующему набору
  3. в список выйдет обратным

Также обратите внимание, что это узкоспециализированная функция. На вашем месте я бы постарался сделать это более общим, если вы когда-нибудь планируете использовать его повторно.

Веселитесь.