使用pandas读取csv文件时如何选择多行?

时间:2017-12-21 04:27:37

标签: python pandas csv

我有一个非常大的带有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选择行,因为我尝试最小化读取文件的时间。谢谢。

8 个答案:

答案 0 :(得分:3)

有一个名为nrows : int, default None的参数 要读取的文件行数。用于阅读大型文件 (文档)

pd.read_csv(file_name,nrows=int)

如果您需要中间的某个部分。在skiprows中同时使用nrowsread_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)范围内

第一个参数是第一行,最后一个参数是最后一行...