使用Python Pandas以块的形式访问数据

时间:2016-05-11 12:12:27

标签: python pandas numpy large-data

我有一个大文本文件,由半列分隔。我正在尝试检索列的值(例如第二列)并使用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

1 个答案:

答案 0 :(得分:0)

chunk是一个数据框。

因此您可以使用.ix / .loc / .iloc / .at / etc.之类的索引器(加密器)访问它:

chunk.ix[:, 'col_name']
chunk.iloc[:, 1]  # second column