mam Deedle Ramka danych, która wygląda tak.
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
Chciałbym usunąć wiersze, które mają takie same wartości obie size1 i size2 jako poprzedni wiersz. W pseudo kodzie ...
if row?size1 = prevRow?size1 && row?size2 = prevRow?size2 then dropRow
Tak więc w powyższym przykładzie otrzymam:
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
Wierzę, że chcę użyć
Frame.filterRowValues(row - > )
Ale nie widzę, jak porównać jeden wiersz z poprzedniego rzędu.Czy jest prosty sposób to zrobić? Być może trzeba przesunąć i dołączyć?
Odpowiedzi:
3 dla odpowiedzi № 1Można to zrobić na kilka sposobów i nie jestem do końca pewien, który jest najlepszy:
Użyj shift i join (jak mówisz) z pewnością zadziała - będziesz musiał zmienić nazwę kolumn w jednej z ramek, abyś mógł do nich dołączyć, ale brzmi to całkiem nieźle dla mnie
Możesz użyć
frame.Rows |> Series.pairwise
aby uzyskać krotki zawierające bieżący i poprzedni wiersz, a następnie użyjSeries.filter
iSeries.map
(aby wybrać drugi wiersz z krotki) i ponownie skonstruuj ramkę za pomocąFrame.ofRows
. Jedynym problemem jest to, że zawsze stracisz pierwszy rząd w ten sposób (i będziesz musiał go dodać z powrotem).Możesz użyć
Frame.filter
i znajdź poprzedni wiersz. Obsługa najnowszych wersjiLookup.Smaller
co pozwala ci to łatwo zrobić.
Kod trzeciej opcji wygląda następująco (zwróć uwagę, że należy zamówić rzędy klatek frame.Rows.IsOrdered = true
), aby to działało:
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 *) )