如何在python中传入和操作大型数据文件

HFB*_*ing 7 python python-itertools dataframe pandas

我有一个相对较大(1 GB)的文本文件,我希望通过对各个类别求和来减小它们的大小:

Geography AgeGroup Gender Race Count
County1   1        M      1    12
County1   2        M      1    3
County1   2        M      2    0
Run Code Online (Sandbox Code Playgroud)

至:

Geography Count
County1   15
County2   23
Run Code Online (Sandbox Code Playgroud)

如果整个文件可以适合内存但使用pandas.read_csv()give,这将是一件简单的事情MemoryError.所以我一直在研究其他方法,似乎有很多选择 - HDF5?使用itertools(看起来很复杂 - 生成器?)或者只是使用标准文件方法读取第一个地理位置(70行),将count列相加,并在加载另外70行之前写出.

有没有人对最佳方法有任何建议?我特别喜欢流数据的想法,特别是因为我可以想到很多其他有用的地方.我对这种方法最感兴趣,或者类似地使用最基本功能的方法.

编辑:在这个小案例中,我只想要按地理位置计算的数量.但是,如果我可以读入一个块,指定任何函数(比如一起添加2列,或者按地理位置取一列的最大值),应用函数,并在读取新块之前写入输出,这将是理想的.

roo*_*oot 11

您可以使用dask.dataframe,在语法上类似于pandas,但执行非核心操作,因此内存不应成为问题:

import dask.dataframe as dd

df = dd.read_csv('my_file.csv')
df = df.groupby('Geography')['Count'].sum().to_frame()
df.to_csv('my_output.csv')
Run Code Online (Sandbox Code Playgroud)

或者,如果pandas是要求,您可以使用chunked读取,如@chrisaycock所述.您可能想要试验该chunksize参数.

# Operate on chunks.
data = []
for chunk in pd.read_csv('my_file.csv', chunksize=10**5):
    chunk = chunk.groupby('Geography', as_index=False)['Count'].sum()
    data.append(chunk)

# Combine the chunked data.
df = pd.concat(data, ignore_index=True)
df = df.groupby('Geography')['Count'].sum().to_frame()
df.to_csv('my_output.csv')
Run Code Online (Sandbox Code Playgroud)