我有一个大文本文件,由半列分隔。我正在尝试检索列的值(例如第二列)并使用numpy迭代地处理它。下面给出了文本文件中包含的数据示例:
10862;2;1;1;0;0;0;3571;0;
10868;2;1;1;1;0;0;3571;0;
10875;2;1;1;1;0;0;3571;0;
10883;2;1;1;1;0;0;3571;0;
...
11565;2;1;1;1;0;0;3571;0;
11572;2;1;1;1;0;0;3571;0;
11579;2;1;1;1;0;0;3571;0;
11598;2;1;1;1;0;0;3571;0;
11606;2;1;1;
请注意,最后一行可能不包含与前一行相同数量的值。
我正在尝试使用pandas.read_csv通过块读取这个大文件。出于示例的目的,我们假设块大小为40。
到目前为止,我尝试了两种不同的方法:
1)
设置nrows
,并迭代地增加skiprows
,以便按块读取整个文件。
nrows_set = 40
n_it = 0
while(1):
df = pd.read_csv(filename, nrows=nrows_set , sep=';',skiprows = n_it * nrows_set)
vect2 = df[1] # trying to access the values of the second column -- works
n_it = n_it+1
访问文件末尾时出现问题:当尝试读取大于文件中包含的行数的行时,Pandas会生成错误。
例如,如果文件包含20行,并且nrows
设置为40,则无法读取该文件。当我尝试读取文件的最后40行时,我的第一种方法因此产生了一个错误,当时剩下的不到40行。
我不知道在尝试从文件中读取之前如何检查文件的结尾 - 我不想加载整个文件以获取文件很大的总行数。因此,我尝试了第二种方法。
2)
设置chunksize
。这很好用,但是当我尝试以块的形式访问数据时,我有一个问题:
reader = pd.read_csv(filename, chunksize=40, sep=';')
for chunk in reader :
print(chunk) # displays data -- the data looks correct
chunk[1] # trying to access the values of the second column -- generates an error
chunk
的数据类型是什么,如何进行转换以便此操作有效?
或者,如何在不将整个文件加载到内存中的情况下检索文件中包含的行数(解决方案1)?
感谢您的帮助! Gaelle
答案 0 :(得分:0)
chunk是一个数据框。
因此您可以使用.ix / .loc / .iloc / .at / etc.
之类的索引器(加密器)访问它:
chunk.ix[:, 'col_name']
chunk.iloc[:, 1] # second column