使用 Python Pandas 分块访问数据
Posted
技术标签:
【中文标题】使用 Python Pandas 分块访问数据【英文标题】:Accessing data in chunks using Python Pandas 【发布时间】:2016-09-06 20:06:18 【问题描述】:我有一个大文本文件,以半列分隔。我正在尝试检索一列(例如第二列)的值并使用 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。
到目前为止,我已经尝试了 2 种不同的方法:
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 尝试读取的行数大于文件中包含的行数时,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))?
感谢您的帮助! 盖尔
【问题讨论】:
【参考方案1】:chunk 是一个数据框。
因此您可以使用索引器(访问器)访问它,例如 .ix / .loc / .iloc / .at / etc.
:
chunk.ix[:, 'col_name']
chunk.iloc[:, 1] # second column
【讨论】:
太棒了!我刚试过,效果很好。非常感谢您的快速答复。盖尔 对不起,我说得太早了,我和以前一样的错误。 np.diff(chunk.iloc[:,1]) # 生成错误我想我必须使用类似 pandas.DataFrame.as_matrix 的东西 @Gaelle,你可以使用类似的pandas方法:chunk.ix[condition, 'col_name'].diff()
以上是关于使用 Python Pandas 分块访问数据的主要内容,如果未能解决你的问题,请参考以下文章