/ / Вилучіть рядки, які є біля дубліката попереднього рядка в даному фреймі даних Deedle - f #, фрейм даних, f # -дані, deedle

Видалити рядки, що знаходяться біля дублікату попереднього рядка у файловому діапазоні Deedle - f #, dataframe, f # -data, 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 - > )

Але я не бачу, як порівняти один рядок з попереднім рядком. Чи є простий спосіб це зробити? Можливо, мені потрібно змінити і приєднатися?

Відповіді:

3 для відповіді № 1

Це можна зробити за допомогою декількох способів, і я не зовсім впевнений, який найкращий:

  • Використовуйте shift і приєднатися (як ви говорите), безумовно, спрацює - вам потрібно буде перейменувати стовпці в одному з кадрів, щоб ви могли приєднатися до них, але це здається мені досить хорошим рішенням

  • Ви можете використовувати frame.Rows |> Series.pairwise щоб отримати кортежі, що містять поточний і попередній рядок, потім використовуйте Series.filter і 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 *) )