我有一个庞大的数据集,我试图逐行阅读。 目前,我正在使用pandas读取数据集:
df = pd.read_csv("mydata.csv", sep =',', nrows = 1)
此功能允许我只读第一行,但如何读取第二行,第三行等等? (我想用熊猫。)
编辑: 为了更清楚,我需要一次读取一行,因为数据集是20 GB,我无法将所有内容保存在内存中。
答案 0 :(得分:3)
查看pandas文档,read_csv函数有一个参数:
skiprows
如果为此参数分配了一个列表,它将跳过列表索引的行:
skiprows = [0,1]
这将跳过第一行和第二行。
因此,nrow
和skiprows
的组合允许分别读取数据集中的每一行。
答案 1 :(得分:0)
您正在使用nrows = 1
,这意味着“要读取的文件行数。有用于读取大型文件”
所以你告诉它只读第一行并停止。
您应该删除参数以将所有csv文件读入DataFrame,然后逐行进行。
有关使用情况的详细信息,请参阅文档:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html
答案 2 :(得分:0)
一种方法是逐部分读取文件并存储每个部分,例如:
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循环中。
答案 3 :(得分: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
是非负数,并在其周围加上try/except StopIteration
row = next(r)
行,这样您就可以抓住读者到达文件末尾的位置。