根据最后一行的值对列进行排序

时间:2016-05-14 10:38:08

标签: f# deedle fslab

我需要根据最后一行的值对Deedle数据框的列进行排序。因此第一列将具有最大值,而最后一列将具有最后一行中的最小值。 Deedle的Frame在行上具有大部分功能。

以下是一些生成样本数据的代码,其中Item2最终会得到一个大于Item1的值:

#load @"..\..\FSLAB\packages\FsLab\FsLab.fsx"
open System
open System.Drawing
open System.Windows.Forms
open Deedle
open FSharp.Charting
open FSharp.Charting.ChartTypes

let rnd = new System.Random()
let dateRange = [for i in 9..-1..0 ->  DateTime.Today.AddDays(float -i)]
let makeData x = [for i in 0..x-2 -> rnd.NextDouble()-0.5] |> List.scan (+) 0.
let series = makeData 10 |> List.zip <| (makeData 10 |> List.map (fun x -> x + 1.))
let df = series |> Frame.ofRecords
df?DateIndex <- dateRange |> Series.ofValues 
let df = df.IndexRows<DateTime>("DateIndex")

在这种情况下,Frame的最后一行将如下所示,具有第二列中较大的值:
2016/05/14 0:00:00 -> 0.143158562780897 0.918480403450541

但我希望按顺序排列:
2016/05/14 0:00:00 -> 0.918480403450541 0.143158562780897

我发布了一个答案,但想知道是否有其他方法,因为我还不太熟悉Deedle。

1 个答案:

答案 0 :(得分:0)

Frame.sortRowsWith需要一个排序功能:

let reverser (a:float) (b:float) =
    if a > b then
        -1
    else if  a < b then
        1
    else
        0

let df1 = df |> Frame.transpose
let coldIdx = df1.ColumnKeys |> Seq.max
Frame.sortRowsWith coldIdx reverser df1 |> Frame.transpose

因此,它转换数据Frame,然后获取最后一行的索引(在本例中为列)并将列从最大到最小排序,最后将其转置回来。这对图表很方便,因为图表图例的这种方式将与图表中的系列对齐。

相关问题