重命名 Deedle 数据框列的直接功能方法

A straightforward functional way to rename columns of a Deedle data frame

是否有一种简洁实用的方法来重命名 Deedle 数据框的列 f

f.RenameColumns(...) 是可用的,但是会改变它所应用的数据框,所以让重命名操作幂等有点痛苦。我有一个类似 f.RenameColumns (fun c -> ( if c.IndexOf( "_" ) < 0 then c else c.Substring( 0, c.IndexOf( "_" ) ) ) + "_renamed") 的东西,它很丑。

如果能从输入帧创建一个新帧就好了,像这样:Frame( f |> Frame.cols |> Series.keys |> Seq.map someRenamingFunction, f |> Frame.cols |> Series.values ) 但这会被第二部分绊倒——f |> Frame.cols |> Series.values 的类型不是Frame 构造函数需要什么。

我怎样才能简洁地转换 f |> Frame.cols |> Series.values 以便它的结果可以被 Frame 构造函数使用?

RenameColumns一起使用可以判断其作用:

df.RenameColumns someRenamingFunction

您还可以使用函数Frame.mapColKeys。

Builds a new data frame whose columns are the results of applying the specified function on the columns of the input data frame. The function is called with the column key and object series that represents the column data. Source

示例:

type Record = {Name:string; ID:int ; Amount:int}

let data = 
    [| 
        {Name = "Joe";     ID = 51; Amount = 50};    
        {Name = "Tomas";   ID = 52; Amount = 100};  
        {Name = "Eve";     ID = 65; Amount = 20};   
    |]

let df = Frame.ofRecords data

let someRenamingFunction s =
    sprintf "%s(%i)" s s.Length

df.Format() |> printfn "%s"

let ndf = df |> Frame.mapColKeys someRenamingFunction

ndf.Format() |> printfn "%s"

df.RenameColumns someRenamingFunction

df.Format() |> printfn "%s"

打印:

     Name  ID Amount
0 -> Joe   51 50
1 -> Tomas 52 100
2 -> Eve   65 20

     Name(4) ID(2) Amount(6)
0 -> Joe     51    50
1 -> Tomas   52    100
2 -> Eve     65    20

     Name(4) ID(2) Amount(6)
0 -> Joe     51    50
1 -> Tomas   52    100
2 -> Eve     65    20