首页 > 解决方案 > 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)

标签: dataframego

解决方案


您必须传递具有所需签名的函数,因此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
    }
}

推荐阅读