我有一个非常大的 csv 文件millions of rows和一个我需要的行号列表。
rownumberList = [1,2,5,6,8,9,20,22]
Run Code Online (Sandbox Code Playgroud)
我知道有一种叫做skiprows可以帮助跳过几行的reading csv file东西
df = pd.read_csv('myfile.csv',skiprows = skiplist)
#skiplist would contain the total row list deducts rownumberList
Run Code Online (Sandbox Code Playgroud)
但是,由于 csv 文件非常大,直接选择我需要的行可能会更有效率。所以我想知道select rows使用时有什么方法read_csv吗?之后不要尝试选择行dataframe,因为我尽量减少读取文件的时间。谢谢。
有一个参数称为 nrows : int, default None
要读取的文件行数。用于读取大文件(文档)
pd.read_csv(file_name,nrows=int)
Run Code Online (Sandbox Code Playgroud)
如果您需要中间的某些部分。两者都使用skiprows,以及nrows在read_csv。如果skiprows指示开始行和nrows跳绳例如打开后会显示行的下一个号码。
例子:
pd.read_csv('../input/sample_submission.csv',skiprows=5,nrows=10)
Run Code Online (Sandbox Code Playgroud)
这将从第 6 行到第 16 行选择数据
根据评论编辑:
由于有一个列表,这个列表可能会有所帮助,即
li = [1,2,3,5,9]
r = [i for i in range(max(li)) if i not in li]
df = pd.read_csv('../input/sample_submission.csv',skiprows=r,nrows= max(li))
# This will skip the rows you dont want as well as limit the number of rows to maximum of the list.
Run Code Online (Sandbox Code Playgroud)
我不确定read_csv()Pandas 的情况(虽然有一种方法可以使用 aniterator来分块读取大文件),但是您可以使用csv.reader(或csv.DictReader),在以下命令的帮助下只留下所需的行enumerate():
import csv
import pandas as pd
DESIRED_ROWS = {1, 17, 28}
with open("input.csv") as input_file:
reader = csv.reader(input_file)
desired_rows = [row for row_number, row in enumerate(reader)
if row_number in DESIRED_ROWS]
df = pd.DataFrame(desired_rows)
Run Code Online (Sandbox Code Playgroud)
(假设您想从中间的某个位置选择随机/不连续的行而不是“连续的块” - 在这种情况下@James的“开始”和“停止”的想法通常会更好)。