GoTa Series返回全为NaN但调试器显示值正常 如何解决?
问题修复方案
根因分析
- 类型不匹配:Gota的
series.Floats()构造函数仅支持float64类型输入,你代码中使用float32计算后直接传入,类型不匹配导致序列化异常,最终生成NaN值。 - 取值逻辑错误:
Rapply传入的series.Series是当前行的完整数据序列,哪怕仅Select单个字段,也不能直接调用s.String()获取字段值,该方法返回的是Series对象的格式化描述而非实际字段内容,会导致后续字符计数、长度计算全部错误,极端情况会出现空串触发除0逻辑,也会生成NaN。
修复代码
计算函数调整
func hardVowels(s series.Series) series.Series { // 取当前行第一个元素(对应Select的name字段)转字符串 name := s.Elem(0).String() name = prepName(name) runeName := []rune(name) lengthName := float64(len(runeName)) // 提前处理空姓名的除0问题 if lengthName == 0 { return series.Floats(0.0) } hardVow1 := float64(strings.Count(name, "p")) hardVow2 := float64(strings.Count(name, "k")) hardVow3 := float64(strings.Count(name, "f")) hardVowScore := (hardVow1 + hardVow2 + hardVow3) / lengthName return series.Floats(hardVowScore) }
调用逻辑无需修改
hardVowSeries := df.Select("name").Rapply(hardVowels) hardVowSeries.SetNames("hard Vowel Score")
额外验证建议
如果调整后仍有异常,可以在函数内增加日志打印name变量的实际值,确认prepName函数的输出是否符合预期,避免预处理逻辑导致异常空值。
内容的提问来源于stack exchange,提问作者Code_beginner
相关产品推荐
相关产品推荐

