You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何我的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会包含重复的列。

解决办法

有两种常见的解决方式:

  1. 指定需要映射的属性
    使用Frame.ofRecords的重载版本,手动指定要转换为列的属性,避免包含幕后字段:

    let df = Frame.ofRecords (fun (p: Person) -> (p.Name, p.Age, p.Gender)) people
    
  2. 创建后筛选目标列
    先创建包含所有列的DataFrame,再通过Frame.selectCols筛选出需要的公开属性列:

    let df = Frame.ofRecords people |> Frame.selectCols ["Name"; "Age"; "Gender"]
    

内容的提问来源于stack exchange,提问作者Soldalma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 21:27:08