dataframe - dataframe-go:如何使用 < > 运算符进行过滤?
问题描述
我正在尝试在dataframe-go
. 我改编自 Github 示例并尝试>
在过滤函数中使用简单的运算符,但编译器给出了invalid operation: vals["day"] > 4 (operator > not defined on interface)
错误(请参阅下面的代码)
好的,所以我将类型更改为,map[string]int64
但随后出现错误:cannot convert func literal (type func(map[string]int64, int, int) (dataframe.FilterAction, error)) to type dataframe.FilterDataFrameFn
.
我对 R DataFrame/Table 和 Pandas 非常熟悉,但它dataframe-go
的 API 相当复杂。我找到的唯一网络资源是这个,但作者也表示他无法理解过滤器 API。
任何帮助表示赞赏,谢谢!
s1 := dataframe.NewSeriesInt64("day", nil, 1, 2, 3, 4, 5, 6, 7, 8)
s2 := dataframe.NewSeriesFloat64("sales", nil, 50.3, 23.4, 56.2, nil, nil, 84.2, 72, 89)
df := dataframe.NewDataFrame(s1, s2)
// Try filtering
filterFn := dataframe.FilterDataFrameFn(
func(vals map[string]int64, row, nRows int) (dataframe.FilterAction, error) {
//func(vals map[interface{}]interface{}, row, nRows int) (dataframe.FilterAction, error) {
if vals["day"] > 4 { // <= This is where I changed things
return dataframe.KEEP, nil
}
return dataframe.DROP, nil
})
ctx := context.Background()
dt_filtered, _ := dataframe.Filter(ctx, df, filterFn)
fmt.Print(dt_filtered)
解决方案
您必须传递具有所需签名的函数,因此vals
必须是map[interface{}]interface{}
. 这是必需的,因为 Go 不是解释型语言,并且调用您作为参数传递的函数的代码对传入的函数没有编译时知识。
由于您的值是interface{}
s,因此您必须将它们转换为正确的类型才能使用它们:
if ivalue, ok:=vals["day"].(int64); ok { // Check if the value is int64, and go ahead if so
if ivalue > 4 {
return dataframe.KEEP, nil
}
}
推荐阅读
- r - r 国家和部门的总值
- reactjs - 为什么我的 POST 请求会导致 404 错误?
- db2 - 重启 DB2 服务后,应用服务器在数据库连接中得到 ERRORCODE=-4499, SQLSTATE=58009
- spring-boot - 如何将 POJO 传递给 SpringBoot 应用程序的运行方法?
- api - 不获取访问令牌
- javascript - 在不使用内置 array.pop() 函数的情况下从数组中弹出最后一项
- elixir - ecto_fixtures,预加载关联
- python - 添加具有不同列名的两个 Pandas 系列的值
- image - 更改个人用户的图像Angular 5
- sql - 使用 Union Select 合并查询