映射一列的值

Map over values of one column

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

df.Columns.[ [ "Title"; "Amount" ] ]
|> Frame.mapCols(fun k s -> 
    if k = "Title" 
    then s |> Series.mapValues (string >> someModif >> box) 
    else s.Observations |> Series)

由于 sObjectSeries<_> 类型,我必须将其转换为 string,然后对其进行修改 box

是否有推荐的方法来映射单个列的值?

您可以使用 GetColumn:

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

或更多 F# 风格:

df
|> Frame.getCol "Title"
|> Series.mapValues(string >> someModif)

另一种选择是添加一个 TitleMapped 列:

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

...然后用 df |> Frame.dropCol "Title" 丢弃 Title 列(如果您不关心它是否保留,则不要打扰)。

或者,如果您不喜欢 <- 的 "imperativeness",您可以这样做:

df?Title 
|> Series.mapValues (...your mapping fn...)
|> fun x -> Frame( ["Title"], [x] ) 
|> Frame.join JoinKind.Left (df |> Frame.dropCol "Title") 

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

someFrame
|> Frame.replaceCol "Col1"
    (Frame.mapRowValues (fun row ->
        row.GetAs<float>("Col1") + row.GetAs<float>("Col2"))
    someFrame)

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