为何我的Deedle DataFrame出现重复列Name@、Age@、Gender@?
Deedle DataFrame 出现重复列(带@后缀)的原因
问题重现
使用以下F#代码创建Deedle DataFrame:
type Person = { Name: string; Age: int; Gender: string; } let people = [ { Name = "Alice"; Age = 25; Gender = "Female" } { Name = "Bob"; Age = 30; Gender = "Male" } { Name = "Carol"; Age = 22; Gender = "Female" } { Name = "David"; Age = 35; Gender = "Male" } ] let df = Frame.ofRecords people
预期生成4行3列的DataFrame,但执行df.ColumnCount后返回6,多出Name@、Age@、Gender@三列。
原因解析
这是F#记录类型的编译特性导致的:F#在编译记录类型时,会为每个公开属性生成对应的幕后字段(backing fields),这些字段的命名规则是原属性名加上@后缀。而Deedle的Frame.ofRecords方法默认会反射遍历记录的所有成员——包括公开属性和这些幕后字段,因此最终生成的DataFrame会包含重复的列。
解决办法
有两种常见的解决方式:
指定需要映射的属性
使用Frame.ofRecords的重载版本,手动指定要转换为列的属性,避免包含幕后字段:let df = Frame.ofRecords (fun (p: Person) -> (p.Name, p.Age, p.Gender)) people创建后筛选目标列
先创建包含所有列的DataFrame,再通过Frame.selectCols筛选出需要的公开属性列:let df = Frame.ofRecords people |> Frame.selectCols ["Name"; "Age"; "Gender"]
内容的提问来源于stack exchange,提问作者Soldalma
相关产品推荐
相关产品推荐

