/ / f # deedle súhrnné hodnoty riadkov založené na stĺpci key - f #, deedle

f # deedle súhrnné hodnoty riadkov založené na stĺpci key - f #, deedle

Mám nasledujúce Frame,

type Person =
{ Name:string; Age:int; Comp1:float; Comp2:float }

let peopleRecds =
[ { Name = "Joe"; Age = 51; Comp1=12.1; Comp2 =20.3 }
{ Name = "Tomas"; Age = 28; Comp1=1.1; Comp2 =29.3 }
{ Name = "Eve"; Age = 2; Comp1=2.1; Comp2 =40.3 }
{ Name = "Suzanne"; Age = 15; Comp1=12.4; Comp2 =26.3} ]
let peopleList = Frame.ofRecords peopleRecds

To, čo by som chcel urobiť, je sumarizovať Comp1 a Comp2 stĺpce do nového stĺpca pre peopleLista n pre Comp(n) je momentálne nerozhodnutá, takže nemôžem len poznať len stĺpce sumy dva, mohlo by to byť Comp3, Comp4, takže sa musia zakladať na regulárnom vyjadrení, čo s kľúčom vedie Comp.

Zdá sa, že by som mal urobiť mapRowValues na každom riadku

   peopleList?TotalComp <- peopleList |>Frame.mapRowValues(
fun row ->
(do something to sum up)
)

Nie som si však istý, ako tu pracovať na úrovni riadkov.

odpovede:

2 pre odpoveď č. 1

Ak sa plánuje zvýšiť počet "Comp", možno by bolo lepšie dať ich do poľa:

type nPerson =  { Name:string; Age:int; Comp:float[] }

let npeopleRecds =
[ { Name = "Joe"; Age = 51; Comp = [| 12.1; 20.3 |] }
{ Name = "Tomas"; Age = 28; Comp = [| 1.1; 29.3  |] }
{ Name = "Eve"; Age = 2; Comp = [| 2.1; 40.3  |] }
{ Name = "Suzanne"; Age = 15; Comp = [|12.4; 26.3 |] } ]

Potom môžete jednoducho pridať stĺpec so súčtom:

let npeopleList = Frame.ofRecords npeopleRecds

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

let sumseries = npeopleList.GetColumn<float []>("Comp") |> Series.mapValues(fun x -> x |> Array.sum)

npeopleList?TotalComp <- sumseries

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

tlač:

     Name    Age Comp
0 -> Joe     51  System.Double[]
1 -> Tomas   28  System.Double[]
2 -> Eve     2   System.Double[]
3 -> Suzanne 15  System.Double[]

Name    Age Comp            TotalComp
0 -> Joe     51  System.Double[] 32,4
1 -> Tomas   28  System.Double[] 30,4
2 -> Eve     2   System.Double[] 42,4
3 -> Suzanne 15  System.Double[] 38,7

edit:

Ak je zmena polí v osobnom zázname neprijateľná - môžete použiť filtre:

let allSum =
peopleList.Columns
|> Series.filter(fun k _ -> k.StartsWith("Comp"))
|> Frame.ofColumns
|> Frame.rows
|> Series.mapValues(Series.foldValues(fun acc v -> acc + (v :?> float)) 0.0)


peopleList?TotalComp <- allSum

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

tlač:

     Name    Age Comp1 Comp2 TotalComp
0 -> Joe     51  12,1  20,3  32,4
1 -> Tomas   28  1,1   29,3  30,4
2 -> Eve     2   2,1   40,3  42,4
3 -> Suzanne 15  12,4  26,3  38,7