F# 映射一列的值

F# 映射一列的值,f#,deedle,F#,Deedle,我想映射我的数据帧的Title列的值。 我提出的解决方案如下: df.Columns.[ [ "Title"; "Amount" ] ] |> Frame.mapCols(fun k s -> if k = "Title" then s |> Series.mapValues (string >> someModif >> box) else s.Observations |> Series) 由于s属于Object

我想映射我的数据帧的
Title
列的值。 我提出的解决方案如下:

df.Columns.[ [ "Title"; "Amount" ] ]
|> Frame.mapCols(fun k s -> 
    if k = "Title" 
    then s |> Series.mapValues (string >> someModif >> box) 
    else s.Observations |> Series)
由于
s
属于
ObjectSeries
类型,我必须将其转换为
string
,然后对其进行修改
box

有没有推荐的方法可以映射单个列的值?

您可以使用GetColumn:

df.GetColumn<string>("Title")
|> Series.mapValues(someModif)

另一个选项是添加一个标题为的列,其中包含:

df?TitleMapped <- df?Title |> Series.mapValues (...your mapping fn...)

在某些情况下,您可能希望映射特定列的值,并将该映射列保留在框架中。假设我们有一个名为someFrame的框架,它有两列(Col1和Col2),我们想要转换Col1(例如,Col1+Col2),我通常做的是:

someFrame
|> Frame.replaceCol "Col1"
    (Frame.mapRowValues (fun row ->
        row.GetAs<float>("Col1") + row.GetAs<float>("Col2"))
    someFrame)
someFrame
|>Frame.replaceCol“Col1”
(Frame.mapRowValues(趣味行->
行GetAs(“Col1”)+行GetAs(“Col2”))
(框架)

如果您想创建一个新列而不是替换它,那么您所要做的就是更改“addCol”的“replaceCol”方法,并为该列选择一个新名称,而不是给定示例中的“Col1”。我不知道这是否是最有效的方法,但到目前为止,它对我很有效。

一个不错的选择。尽管此运算符并不总是按预期工作。例如,此代码:为我提供了一个异常。虽然我不明白为什么。啊!这真烦人。。。嗯,
中缀运算符似乎只适用于数值列。要使字符串列正常工作,请使用pastebin中的示例(稍作缩短,但关键是带有
[“Title”]
):
键入nPerson={Title:string;Amount:decimal}让npeopleRecds=[{Title=“some”;Amount=51M}{Title=“some1”;Amount=28.9M}{Title=“some3”;Amount=20M;}](Frame.ofRecords npeopleRecds |>Frame.cols)。[“Title”]|>Series.mapValues(string>>(fun s->s.ToUpper()))|>fun Series->Series.Format()|>printfn“%A”
确定,以上注释的所有编辑尝试均无效。我试图说明的一点是,对于包含
Title
等列的字符串,我们需要使用
(df |>Frame.cols)。[“Title”]
,或者基本上是您的原始答案。我生活和学习。谢谢@mt99。我最后做的就是添加一个专栏。我使用了
frame.AddColumn(“Label”,frame |>frame.getCol“Title”|>Series.mapValues someModif)
df?Title 
|> Series.mapValues (...your mapping fn...)
|> fun x -> Frame( ["Title"], [x] ) 
|> Frame.join JoinKind.Left (df |> Frame.dropCol "Title") 
someFrame
|> Frame.replaceCol "Col1"
    (Frame.mapRowValues (fun row ->
        row.GetAs<float>("Col1") + row.GetAs<float>("Col2"))
    someFrame)