Return Deedle 中基于行映射的多列/数据框
Return multiple columns / a dataframe in Deedle based on row-wise mapping
我想查看框架中的每一行,并根据该行中的值为新框架构建多个列。
最终结果应该是一个包含原始框架列和新列的框架。
我有一个解决方案,但我想知道是否有更好的解决方案。我认为解释所需行为的最佳方式是举个例子。我正在使用 Deedle's titanic data set:
#r @"F:\aolney\research_projects\braintrust\code\QualtricsToR\packages\Deedle.1.2.3\lib\net40\Deedle.dll";;
#r @"F:\aolney\research_projects\braintrust\code\QualtricsToR\packages\FSharp.Charting.0.90.12\lib\net40\FSharp.Charting.dll";;
#r @"F:\aolney\research_projects\braintrust\code\QualtricsToR\packages\FSharp.Data.2.2.2\lib\net40\FSharp.Data.dll";;
open System
open FSharp.Data
open Deedle
open FSharp.Charting;;
#load @"F:\aolney\research_projects\braintrust\code\QualtricsToR\packages\FSharp.Charting.0.90.12\FSharp.Charting.fsx";;
#load @"F:\aolney\research_projects\braintrust\code\QualtricsToR\packages\Deedle.1.2.3\Deedle.fsx";;
let titanic = Frame.ReadCsv(@"C:\Users\aolne_000\Downloads\titanic.csv");;
框架是这样的:
val titanic : Frame<int,string> =
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 -> 1 False 3 Braund, Mr. Owen Harris male 22 1 0 A/5 21171 7.25 S
1 -> 2 True 1 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female 38 1 0 PC 17599 71.2833 C85 C
我的方法抓取每一行,使用一些选择逻辑,然后 returns 一个新的行值 作为字典 。然后我使用 Deedle 的扩展操作将这个字典中的值转换为新列。
titanic?test <- titanic |> Frame.mapRowValues( fun x -> if x.GetAs<int>("Pclass") > 1 then dict ["A", 1; "B", 2] else dict ["A", 2 ; "B", 1] );;
titanic |> Frame.expandCols ["test"];;
这给出了以下新框架:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked test.A test.B
0 -> 1 False 3 Braund, Mr. Owen Harris male 22 1 0 A/5 21171 7.25 S 1 2
1 -> 2 True 1 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female 38 1 0 PC 17599 71.2833 C85 C 2 1
注意最后两列是 test.A 和 test.B。实际上,这种方法会创建一个新框架(A 和 B),然后将框架加入现有框架。
这对我的用例来说很好,但其他人阅读起来可能会感到困惑。它还会强制使用前缀,例如“测试”,在不太理想的最后一列上。
有没有办法将新值附加到上面代码中 x 表示的行系列的末尾?
我觉得你的方法非常优雅和聪明。因为新系列与原始框架共享索引,所以速度也会非常快。所以,我认为您的解决方案实际上可能比替代方案更好(但我没有对此进行测量)。
无论如何,另一种选择是 return 来自您的 Frame.mapRowValues
调用的新行 - 因此对于每一行,我们 return 原始行和附加列。
titanic
|> Frame.mapRowValues(fun x ->
let add =
if x.GetAs<int>("Pclass") > 1 then series ["A", box 1; "B", box 2]
else series ["A", box 2 ; "B", box 1]
Series.merge x add)
|> Frame.ofRows
我想查看框架中的每一行,并根据该行中的值为新框架构建多个列。
最终结果应该是一个包含原始框架列和新列的框架。
我有一个解决方案,但我想知道是否有更好的解决方案。我认为解释所需行为的最佳方式是举个例子。我正在使用 Deedle's titanic data set:
#r @"F:\aolney\research_projects\braintrust\code\QualtricsToR\packages\Deedle.1.2.3\lib\net40\Deedle.dll";;
#r @"F:\aolney\research_projects\braintrust\code\QualtricsToR\packages\FSharp.Charting.0.90.12\lib\net40\FSharp.Charting.dll";;
#r @"F:\aolney\research_projects\braintrust\code\QualtricsToR\packages\FSharp.Data.2.2.2\lib\net40\FSharp.Data.dll";;
open System
open FSharp.Data
open Deedle
open FSharp.Charting;;
#load @"F:\aolney\research_projects\braintrust\code\QualtricsToR\packages\FSharp.Charting.0.90.12\FSharp.Charting.fsx";;
#load @"F:\aolney\research_projects\braintrust\code\QualtricsToR\packages\Deedle.1.2.3\Deedle.fsx";;
let titanic = Frame.ReadCsv(@"C:\Users\aolne_000\Downloads\titanic.csv");;
框架是这样的:
val titanic : Frame<int,string> =
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 -> 1 False 3 Braund, Mr. Owen Harris male 22 1 0 A/5 21171 7.25 S
1 -> 2 True 1 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female 38 1 0 PC 17599 71.2833 C85 C
我的方法抓取每一行,使用一些选择逻辑,然后 returns 一个新的行值 作为字典 。然后我使用 Deedle 的扩展操作将这个字典中的值转换为新列。
titanic?test <- titanic |> Frame.mapRowValues( fun x -> if x.GetAs<int>("Pclass") > 1 then dict ["A", 1; "B", 2] else dict ["A", 2 ; "B", 1] );;
titanic |> Frame.expandCols ["test"];;
这给出了以下新框架:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked test.A test.B
0 -> 1 False 3 Braund, Mr. Owen Harris male 22 1 0 A/5 21171 7.25 S 1 2
1 -> 2 True 1 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female 38 1 0 PC 17599 71.2833 C85 C 2 1
注意最后两列是 test.A 和 test.B。实际上,这种方法会创建一个新框架(A 和 B),然后将框架加入现有框架。
这对我的用例来说很好,但其他人阅读起来可能会感到困惑。它还会强制使用前缀,例如“测试”,在不太理想的最后一列上。
有没有办法将新值附加到上面代码中 x 表示的行系列的末尾?
我觉得你的方法非常优雅和聪明。因为新系列与原始框架共享索引,所以速度也会非常快。所以,我认为您的解决方案实际上可能比替代方案更好(但我没有对此进行测量)。
无论如何,另一种选择是 return 来自您的 Frame.mapRowValues
调用的新行 - 因此对于每一行,我们 return 原始行和附加列。
titanic
|> Frame.mapRowValues(fun x ->
let add =
if x.GetAs<int>("Pclass") > 1 then series ["A", box 1; "B", box 2]
else series ["A", box 2 ; "B", box 1]
Series.merge x add)
|> Frame.ofRows