映射一列的值

时间:2016-04-23 07:40:38

标签: 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类型为ObjectSeries<_>,我必须将其转换为string,然后将其修改为box

是否有建议的方法来映射单个列的值?

3 个答案:

答案 0 :(得分:3)

另一种选择是添加TitleMapped列:

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

...然后将Title列与df |> Frame.dropCol "Title"一起扔掉(如果您不关心它是否保留,则不要理会。)

或者,如果您不喜欢<-的“强制性”,您可以执行以下操作:

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

答案 1 :(得分:1)

您可以使用GetColumn:

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

或者更多F#风格:

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

答案 2 :(得分:0)

在某些情况下,您可能希望映射特定列的值,并将该映射列保留在框架中。假设我们有一个名为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” 。我不知道这是否是最有效的方法,但到目前为止它对我还是有用的。