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

问题描述 投票:2回答:6

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

python pandas csv
6个回答
3
投票

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

pd.read_csv(file_name,nrows=int)

如果您需要中间的某些部分。在skiprows中同时使用nrowsread_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.

1
投票

我不确定来自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的想法是“开始和”停止“通常会更好地工作”。


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)

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)

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


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]]
© www.soinside.com 2019 - 2024. All rights reserved.