如何使用熊猫读取大型CSV文件中的几行?

时间:2019-05-14 08:04:21

标签: python pandas csv

我的CSV文件无法容纳系统内存。我想使用Pandas读取分散在文件中的少量行。

我认为我可以按照以下步骤操作而无需熊猫:How to read specific lines of a large csv file

在熊猫中,我试图使用跳栏仅选择我需要的行。

# FILESIZE is the number of lines in the CSV file (~600M)
# rows2keep is an np.array with the line numbers that I want to read (~20)

rows2skip = (row for row in range(0,FILESIZE) if row not in rows2keep)
signal = pd.read_csv('train.csv', skiprows=rows2skip)

我希望这段代码能很快返回一个小的数据帧。但是,这样做是在几分钟内开始消耗内存,直到系统变得无响应为止。我猜想它会先读取整个数据帧,然后再删除row2skip。

为什么此实现如此低效?如何仅使用rows2keep中指定的行有效地创建数据框?

3 个答案:

答案 0 :(得分:1)

尝试一下

train = pd.read_csv('file.csv', iterator=True, chunksize=150000)

如果您只想读取前n行:

train = pd.read_csv(..., nrows=n)

如果您只想读取n到n + 100之间的行

train = pd.read_csv(..., skiprows=n, nrows=n+100)

答案 1 :(得分:0)

chunksize应该有助于限制内存使用。另外,如果您只需要几行,一种可能的方法是先读取所需的熊猫行,然后仅用该子集喂read_csv。代码可能是:

lines = [line for i, line in enumerate(open('train.csv')) if i in lines_to_keep]
signal = pd.read_csv(io.StringIO(''.join(lines)))

答案 2 :(得分:0)

您好,您也可以尝试使用黄昏来读取文件。它速度更快,并且不会占用太多内存。