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
相关产品推荐
相关产品推荐

