使用gota的ReadCSV函数时跳过行

huangapple go评论110阅读模式
英文:

Skipping rows when using gota ReadCSV

问题

在gota中,你可以使用skip参数来跳过指定的行数。下面是一个示例:

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

func main() {
	// 打开文件
	f, err := os.Open("data.tsv")
	if err != nil {
		fmt.Println("无法打开文件:", err)
		return
	}
	defer f.Close()

	// 读取数据框
	df := dataframe.ReadCSV(f, dataframe.HasHeader(true), dataframe.Skip(3))
	fmt.Println(df)
}

在上面的示例中,Skip(3)表示跳过前3行。你可以根据需要修改数字来跳过不同的行数。

英文:

I'm coming from pandas which has a convenient skiprows parameter like this:

df = pd.read_csv(tsv_file, sep="\t", encoding=encoding, skiprows=3, thousands=",")

How can I do this with gota?

答案1

得分: 2

你可以使用encoding/csv包来首先操作行。

有两种方法:

  1. 使用csv.Read()来读取每一行。
  2. 切片记录。

以下是示例,请查看注释以了解第一种和第二种方法。

package main

import (
	"encoding/csv"
	"fmt"
	"os"

	"github.com/go-gota/gota/dataframe"
)

func main() {
	f, err := os.Open("sample.csv")
	if err != nil {
		panic(err.Error())
	}
	defer f.Close()

	csv := csv.NewReader(f)

	err = SkipRows(csv, 3) // 这将跳过csv中的行,第一种方法
	if err != nil {
		panic(err.Error())
	}

	records, err := csv.ReadAll() // 获取所有记录
	if err != nil {
		panic(err.Error())
	}

	// records = records[3:] // 第二种方法
	df := dataframe.LoadRecords(records)

	fmt.Println(df.Records())
	fmt.Println(df.Names())
}

func SkipRows(csv *csv.Reader, skip int) (err error) {
	for i := 0; i < skip; i++ {
		_, err = csv.Read()
		if err != nil {
			return
		}
	}
	return
}

sample.csv

1,1,1
2,2,2
3,3,3
header1,header2,header3
5,5,5
6,6,6
7,7,7
8,8,8
9,9,9
10,10,10
11,11,11
12,12,12
13,13,13
14,14,14
15,15,15
16,16,16
17,17,17
18,18,18
19,19,19
20,20,20
21,21,21

输出

[[header1 header2 header3] [5 5 5] [6 6 6] [7 7 7] [8 8 8] [9 9 9] [10 10 10] [11 11 11] [12 12 12] [13 13 13] [14 14 14] [15 15 15] [16 16 16] [17 17 17] [18 18 18] [19 19 19] [20 20 20] [21 21 21]]
[header1 header2 header3]

ReadCSV函数的最后调用了LoadRecords,就像我的示例一样。https://github.com/go-gota/gota/blob/f70540952827cfc8abfa1257391fd33284300b24/dataframe/dataframe.go#L1360

英文:

You can use encoding/csv to manipulate rows first.

There are 2 methods.

  1. Using csv.Read() to read each rows.
  2. Slice the records.

This is the example, please see comments to see first and second method.

package main

import (
	&quot;encoding/csv&quot;
	&quot;fmt&quot;
	&quot;os&quot;

	&quot;github.com/go-gota/gota/dataframe&quot;
)

func main() {
	f, err := os.Open(&quot;sample.csv&quot;)
	if err != nil {
		panic(err.Error())
	}
	defer f.Close()

	csv := csv.NewReader(f)

	err = SkipRows(csv, 3) // this will skip rows in csv FIRST METHOD
	if err != nil {
		panic(err.Error())
	}

	records, err := csv.ReadAll() // get all records
	if err != nil {
		panic(err.Error())
	}

	// records = records[3:] // SECOND METHOD
	df := dataframe.LoadRecords(records)

	fmt.Println(df.Records())
	fmt.Println(df.Names())
}

func SkipRows(csv *csv.Reader, skip int) (err error) {
	for i := 0; i &lt; skip; i++ {
		_, err = csv.Read()
		if err != nil {
			return
		}
	}
	return
}

sample.csv

1,1,1
2,2,2
3,3,3
header1,header2,header3
5,5,5
6,6,6
7,7,7
8,8,8
9,9,9
10,10,10
11,11,11
12,12,12
13,13,13
14,14,14
15,15,15
16,16,16
17,17,17
18,18,18
19,19,19
20,20,20
21,21,21

output

[[header1 header2 header3] [5 5 5] [6 6 6] [7 7 7] [8 8 8] [9 9 9] [10 10 10] [11 11 11] [12 12 12] [13 13 13] [14 14 14] [15 15 15] [16 16 16] [17 17 17] [18 18 18] [19 19 19] [20 20 20] [21 21 21]]
[header1 header2 header3]

In the end of ReadCSV function is calling LoadRecords like my example. https://github.com/go-gota/gota/blob/f70540952827cfc8abfa1257391fd33284300b24/dataframe/dataframe.go#L1360

huangapple
  • 本文由 发表于 2022年3月2日 05:58:27
  • 转载请务必保留本文链接:https://go.coder-hub.com/71315079.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定