使用Go Gota的mutate创建新列时遇‘wrong dimensions’错误求助
解决Gota DataFrame Mutate维度不匹配问题:从rapply结果提取Series
问题根源
你遇到的mutate: wrong dimensions错误,核心原因是df.Select("B").rapply(logFunc)返回的是单列DataFrame,而非你预期的Series。直接把这个DataFrame传给Series.New会导致生成的"Series"实际维度不匹配,触发Gota的长度校验逻辑。
解决方案步骤
从rapply返回的DataFrame中提取目标Series
因为rapply作用于DataFrame时,会返回结构一致的DataFrame(哪怕只有一列),你可以通过Col方法提取其中的Series:- 通过索引提取:
targetSeries := newColDF.Col(0)(单列DataFrame的索引为0) - 通过列名提取:如果rapply保留了原列名,也可以用
targetSeries := newColDF.Col("B")
- 通过索引提取:
修正Mutate调用代码
注意Gota的方法是大写开头的Mutate(不是小写mutate),且直接传入提取到的Series即可,无需再用Series.New包装(如果需要重命名列,可以先给Series改名)。
完整修正代码
import ( "math" "github.com/go-gota/gota/dataframe" "github.com/go-gota/gota/series" ) func main() { // 假设df是已初始化的包含A、B列的DataFrame logFunc := func(s series.Series) series.Series { floats := s.Float() outCol := []float64{} for _, f := range floats { outCol = append(outCol, math.Ceil(1-math.Log(f))) } return series.Floats(outCol) } // 1. 用Rapply处理得到单列DataFrame(注意Rapply大写开头) newColDF := df.Select("B").Rapply(logFunc) // 2. 提取其中的Series targetSeries := newColDF.Col(0) // 可选:给Series重命名为"C" targetSeries = targetSeries.Rename("C") // 3. 调用Mutate添加新列 newDF := df.Mutate(targetSeries) fmt.Println(newDF) }
额外错误修正说明
- 原代码中
df.mutate应为df.Mutate(Gota的API遵循Go的大小写规范,导出方法大写开头) - 原代码
Series.New(newCol, series.Float, "C")参数错误:newCol是DataFrame,不是Series.New所需的原始数据切片或Series - 原代码末尾缺少右括号,导致语法错误
内容的提问来源于stack exchange,提问作者Axas
相关产品推荐
相关产品推荐

