我需要根据最后一行的值对Deedle数据框的列进行排序。因此,第一列的值最大,最后一列的值最小。Deedle的框架在行上具有大部分功能。
以下是一些代码,用于生成示例数据,其中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不太熟悉。
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
因此,它将转置数据帧,然后获取最后一行的索引(在本例中为列),并从最大到最小对列进行排序,最后将其转回。这对于制图非常方便,因为这样,图表图例将与图表中的系列对齐。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句