我有一个非常大的带有millions of rows
的csv文件和一个我需要的行号列表。比如
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
选择行,因为我尝试最小化读取文件的时间。谢谢。
答案 0 :(得分:3)
有一个名为nrows : int, default None
的参数
要读取的文件行数。用于阅读大型文件 (文档)
pd.read_csv(file_name,nrows=int)
如果您需要中间的某个部分。在skiprows
中同时使用nrows
和read_csv
。如果skiprows指示开始行,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.
答案 1 :(得分:1)
我不确定Pandas(there is though a way to use an iterator
for reading a large file in chunks)中的read_csv()
,但您可以使用{{3}逐行读取文件(延迟加载,而不是读取内存中的整个文件) }(或csv.reader
),在csv.DictReader
的帮助下只留下所需的行:
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的想法是“开始和”停止“通常会更好地工作。”
答案 2 :(得分:1)
从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)
答案 3 :(得分:0)
访问大文件时,您将无法规避读取时间。如果您有一个非常大的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)
答案 4 :(得分:0)
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
答案 5 :(得分:0)
您可以尝试
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]]
答案 6 :(得分:0)
import pandas as pd
rownumberList = [1,2,5,6,8,9,20,22]
df = pd.read_csv('myfile.csv',skiprows=lambda x: x not in rownumberList)
对于熊猫0.25.1,pandas read_csv,您可以将可调用函数传递给skiprows
答案 7 :(得分:-1)
对于i在(1,20)范围内
第一个参数是第一行,最后一个参数是最后一行...