2016-06-09 62 views
-1

我想读取一个大型数据矩阵(目前测试90 * 85000,后来150000 * 850000),并对列进行一些操作。熊猫列式组块

为了加快速度,我尝试了chunking。这极大地加速了(〜100x)读取过程,但由于我必须连接列操作的块,所以我在后面的步骤中放弃了所有的加速。

我的问题:
- 有没有办法在列维而不是行维?
- 有什么替代方法可以实现我想要的吗?

\编辑:一些定时运行:

  • 读小型文件:〜10秒
  • 读取小文件,以 'CHUNKSIZE = 20':< 0.1秒
  • 读取小文件,用手动实现按列分块:50岁〜 W/O级联,4分钟以下W /级联
  • 一行
  • 读取文件中的行与一些后处理相当于什么呢大熊猫〜13S
+2

您使用的所有85000列?如果不是只读取你需要的“usecols”列。 – Merlin

+0

@Merlin由于这是预处理步骤,不幸的是,答案是肯定的 – Dahlai

+1

/@ Dahlai磁盘上的文件大小和RAM有多少?用所有的代码你可以概述数据munge过程.....你使用IPython笔记本吗? – Merlin

回答

0

您可以大块都columnsrows

def chunks(lst, chunksize): 
    for i in range(0, len(lst), chunksize): 
     yield lst[i:i+chunksize] 

col_chunksize, row_chunksize = 1000, 1000 
for use_cols in chunks(columns, col_chunksize): 
    for chunk in pd.read_csv(file_path, chunksize=row_chunksize, use_cols=use_cols) 
     process_chunk # e.g. pd.concat() to the process all rows of use_cols 
+0

我实现了这样一个版本。不幸的是,重复的'pd.read_csv'调用结果非常慢,以及后续的并置。我会编辑我的原始问题以提供一些数字。 – Dahlai

+0

可能需要优化块大小。如果您的'column'操作不改变行数/顺序,则不必使用'pd.concat',您可以将底层的numpy数组(包含列的子集的所有行)组合到一个新的DataFrame。 – Stefan

+0

如果我正确理解这一点,这将意味着我会放松列标签?它们对我以后的数据工作至关重要 – Dahlai