使用 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 分块访问数据的主要内容,如果未能解决你的问题,请参考以下文章

Python机器学习(九十五)Pandas 有条件访问

Python Pandas 遍历行并访问列名

如何在 Python 数据框中分块读取数据?

如何使用 Pandas 或 Requests 在 Python 中访问私有 Github Repo 文件 (.csv)

当列数事先未知时如何访问 Pandas 数据框列

使用分块将 CSV 文件读入 Pandas 数据帧,生成单个目标数据帧