如何使用pandas读取csv文件中的特定行号?

13

我有一个庞大的数据集,正在尝试逐行读取它。目前,我正在使用Pandas读取数据集:

df = pd.read_csv("mydata.csv", sep =',', nrows = 1)

这个函数允许我只读取第一行,但是如何读取第二行,第三行等等呢? (我想使用pandas。)

编辑: 为了更清楚,我需要逐行读取,因为数据集有20 GB,而且我不能在内存中保存所有的东西。


我无法读取整个数据集,它有20GB大小,我没有这么多时间。@SandeepKadapa - Guido Muscioni
4个回答

20

一种方法是逐部分阅读您的文件并存储每个部分,例如:

df1 = pd.read_csv("mydata.csv", nrows=10000)

在这里,您将跳过已经读取并存储在df1中的前10000行,并将接下来的10000行存储在df2中。

df2 = pd.read_csv("mydata.csv", skiprows=10000 nrows=10000)
dfn = pd.read_csv("mydata.csv", skiprows=(n-1)*10000, nrows=10000)

也许有一种方法可以将这个想法引入for循环或while循环中。


9

在pandas文档中,read_csv函数有一个参数:

skiprows

如果该参数分配了一个列表,它将跳过列表中所标记的行:

skiprows = [0,1]

这将跳过第一行和第二行。 因此,nrowskiprows 的组合允许逐行读取数据集。

1
您正在使用nrows = 1,意思是“要读取的文件行数。适用于读取大文件的一部分”。
因此,您告诉它只读取第一行并停止。
您应该删除参数以将整个csv文件读入DataFrame,然后逐行进行处理。
有关用法的更多详细信息,请参阅文档:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

我已经更新了问题,清楚地说明我无法读取整个数据集。@Aymen - Guido Muscioni

0

我发现使用skiprows非常慢。这种方法对我很有效:

line_number = 8 # the row you want. 0-indexed

import pandas as pd
import sys # or `import itertools`
import csv

# you can wrap this block in a function:
# (filename, line_number[, max_rows]) -> row
with open(filename, 'r') as f:
    r = csv.reader(f)
    for i in range(sys.maxsize**10): # or `i in itertools.count(start=0)`
        if i != line_number:
            next(r) # skip this row
        else:
            row = next(r)
            row = pd.DataFrame(row) # or transform it however you like
            break # or return row, if this is a function

# now you can use `row` !

为了使其更加健壮,您可以将sys.maxsize**10替换为实际的总行数和/或确保line_number是非负数,并在row = next(r)行周围放置一个try/except StopIteration块,以便您可以捕获读取器到达文件结尾的情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接