我有一个非常大的csv文件与millions of rows
和我需要的行号列表
rownumberList = [1,2,5,6,8,9,20,22]
我知道有一种叫做skiprows
的东西有助于在reading csv file
那样跳过几行
df = pd.read_csv('myfile.csv',skiprows = skiplist)
#skiplist would contain the total row list deducts rownumberList
但是,由于csv文件非常大,直接选择我需要的行可能更有效。所以我想知道使用select rows
时有什么方法可以使用read_csv
吗?之后不尝试使用dataframe
选择行,因为我尝试最小化读取文件的时间。谢谢。
有一个名为nrows : int, default None
的参数要读取的文件行数。用于阅读大型文件(Docs)
pd.read_csv(file_name,nrows=int)
如果您需要中间的某些部分。在skiprows
中同时使用nrows
和read_csv
。如果跳过表示开始行,nrows
将指示跳过后的下一行数。
例:
pd.read_csv('../input/sample_submission.csv',skiprows=5,nrows=10)
这将从第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.
我不确定来自Pandas(read_csv()
)的there is though a way to use an iterator
for reading a large file in chunks,但是您可以使用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)
(假设你想从中间的某个地方挑选随机/不连续的行而不是“连续的大块” - 在这种情况下@ James的想法是“开始和”停止“通常会更好地工作”。
从de documentation你可以看到skiprows
可以将整数或列表作为值来删除一些行。
所以基本上你可以告诉它删除所有你想要的东西。为此,您首先需要知道文件中的行数(如果您事先知道,最好),打开它并计算如下:
with open('myfile.csv') as f:
row_count = sum(1 for row in f)
现在你需要创建补充列表(这里是设置但也有效,不知道为什么)。首先,从1到行数创建一个,然后减去要读取的行数。
skiplist = set(range(1, row_count+1)) - set(rownumberList)
最后你可以正常阅读csv。
df = pd.read_csv('myfile.csv',skiprows = skiplist)
这是完整的代码:
import pandas as pd
with open('myfile.csv') as f:
row_count = sum(1 for row in f)
rownumberList = [1,2,5,6,8,9,20,22]
skiplist = set(range(1, row_count+1)) - set(rownumberList)
df = pd.read_csv('myfile.csv', skiprows=skiplist)
访问大文件时,您将无法规避读取时间。如果您有一个非常大的CSV文件,任何程序都需要至少读取它,直到您想要开始提取行。真的,这就是数据库的设计目标。
但是,如果要从10,000,000行CSV文件中提取行300,000到300,123,那么在将其转换为Pandas中的数据框之前,最好只读取Python所需的数据。为此,您可以使用csv
模块。
import csv
import pandas
start = 300000
stop = start + 123
data = []
with open('/very/large.csv', 'r') as fp:
reader = csv.reader(fp)
for i, line in enumerate(reader):
if i >= start:
data.append(line)
if i > stop:
break
df = pd.DataFrame(data)
import pandas as pd
df = pd.read_csv('Data.csv')
df.iloc[3:6]
返回第3行到第5行以及所有列。
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.iloc.html
你可以试试这个
import pandas as pd
#making data frame from a csv file
data = pd.read_csv("your_csv_flie.csv", index_col ="What_you_want")
# retrieving multiple rows by iloc method
rows = data.iloc [[1,2,5,6,8,9,20,22]]