/ / Usuń wiersze, które są blisko duplikatu poprzedniego wiersza w ramce danych Deedle - f #, ramka danych, f # -data, deedle

Usuń wiersze, które są blisko duplikatu poprzedniego wiersza w ramce danych Deedle - f #, ramka danych, f # -data, deedle

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 № 1

Moż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żyj Series.filter i Series.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 wersji Lookup.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 *) )