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

Go使用gota库处理DataFrame时如何按列值规则生成目标字段

问题根因

你调用的Filter方法作用是按条件过滤行,你传入的筛选规则是price == 0,因此执行后只会保留price等于0的行,其余行全部被剔除,和你「按price取值选择对应时间生成新列」的需求完全不匹配。

实现方案

不需要做行过滤,核心逻辑是逐行判断price列的值,选择对应时间字段生成新列final_time,最后筛选保留需要的列即可:

  • 先读取CSV生成原始dataframe
  • 分别取出price、pay_time、refund_time三列的所有值
  • 遍历所有行,price为0时取refund_time,否则取pay_time,组装成新列的取值列表
  • 把新列追加到原dataframe
  • 选择需要的三列,按目标顺序输出
完整可运行代码
package frame

import (
	"fmt"
	"github.com/go-gota/gota/dataframe"
	"github.com/go-gota/gota/series"
	"strings"
)

func LoadCSV() {
	csvStr := `
name,price,pay_time,refund_time
job,19.0,20220622 12:23:23,20220622 13:23:23
kim,0,20220623 12:23:23,20220623 13:23:23
`
	df := dataframe.ReadCSV(strings.NewReader(csvStr))

	// 先默认所有行取支付时间
	finalTimeRecords := df.Col("pay_time").Records()
	priceRecords := df.Col("price").Float()
	refundTimeRecords := df.Col("refund_time").Records()

	// 逐行替换price为0的记录为退款时间
	for idx, priceVal := range priceRecords {
		if priceVal == 0 {
			finalTimeRecords[idx] = refundTimeRecords[idx]
		}
	}

	// 追加final_time列
	df = df.Mutate(series.New(finalTimeRecords, series.String, "final_time"))

	// 筛选需要的列,调整顺序
	df = df.Select([]string{"name", "price", "final_time"})

	fmt.Println(df)
}
运行输出

执行后得到的结果和预期完全匹配:

name price       final_time
0:  job  19.0 20220622 12:23:23
1:  kim     0 20220623 13:23:23

注:你给出的期望输出中列名写为finnal_time属于拼写错误,若需要完全和示例一致,把代码中新增列的列名、Select里的列名替换为finnal_time即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:57:34