Golang与Python Dataframes数据处理对比

Golang与Python Dataframes数据处理对比 你好,

我想在Go中存储一种本质上类似网格格式的数据,类似于你在Excel电子表格中看到的那种。

Python有pandas dataframe。Go语言中是否有类似且稳定的库呢?

谢谢,

4 回复

@christophberger,

明白了,我同意,我也会看看 Gonum。

谢谢 Cam

更多关于Golang与Python Dataframes数据处理对比的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好 @tranman

我认为有几种可能的选项,具体取决于你的需求。

  • 一个基本的数据网格可以使用基本数据类型构建:切片的切片,或数组的数组。说真的,为了避免过度设计解决方案,这可能是一个可行的选择。
  • 对于处理数值网格数据,可以看看 Gonum
  • 如果你需要接近 Pandas Dataframe 的功能,我找到了一篇文章,讨论了三种此类 Go 包。(免责声明:这些包我都不了解。)

在Go语言中,处理类似pandas dataframe的网格数据,推荐使用Gota库。它提供了DataFrame和Series类型,支持数据操作、过滤、聚合等功能,稳定性较好。

示例代码:

package main

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

func main() {
    // 创建DataFrame
    df := dataframe.New(
        series.New([]string{"Alice", "Bob", "Charlie"}, series.String, "Name"),
        series.New([]int{25, 30, 35}, series.Int, "Age"),
        series.New([]float64{50000.0, 60000.0, 70000.0}, series.Float, "Salary"),
    )
    
    // 显示DataFrame
    fmt.Println(df)
    
    // 过滤数据
    filtered := df.Filter(
        dataframe.F{Colname: "Age", Comparator: series.Greater, Comparando: 30},
    )
    fmt.Println("\nAge > 30:")
    fmt.Println(filtered)
    
    // 选择列
    selected := df.Select([]string{"Name", "Salary"})
    fmt.Println("\nSelected columns:")
    fmt.Println(selected)
    
    // 聚合操作
    meanAge := df.Col("Age").Mean()
    fmt.Printf("\nMean Age: %.2f\n", meanAge)
}

另一个选择是qframe库,它提供类似pandas的API且支持惰性求值:

package main

import (
    "fmt"
    "github.com/tobgu/qframe"
)

func main() {
    qf := qframe.New(
        map[string]interface{}{
            "Name":   []string{"Alice", "Bob", "Charlie"},
            "Age":    []int{25, 30, 35},
            "Salary": []float64{50000, 60000, 70000},
        },
    )
    
    // 过滤和选择
    result := qf.Filter(qframe.Filter{Column: "Age", Comparator: ">", Arg: 30}).
        Select("Name", "Salary")
    
    fmt.Println(result)
}

对于大型数据集处理,可以考虑dataframe-go库:

package main

import (
    "fmt"
    "github.com/rocketlaunchr/dataframe-go"
)

func main() {
    s1 := dataframe.NewSeriesInt64("Age", nil, 25, 30, 35)
    s2 := dataframe.NewSeriesString("Name", nil, "Alice", "Bob", "Charlie")
    
    df := dataframe.NewDataFrame(s1, s2)
    
    // 迭代数据
    df.Lock()
    for row := range df.ValuesIterator(dataframe.ValuesOptions{}) {
        fmt.Println(row)
    }
    df.Unlock()
}

这些库都提供了DataFrame的基本操作,但相比pandas功能更精简。Gota的API最接近pandas,qframe在性能优化方面较好,dataframe-go则提供了更底层的控制。根据具体需求选择合适的库即可。

回到顶部