Я маю Дідл Кадр даних, який виглядає приблизно так.
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 *) )