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)