我有一个相对较大 (1 GB) 的文本文件,我想通过跨类别求和来减小它的大小:
Geography AgeGroup Gender Race Count
County1 1 M 1 12
County1 2 M 1 3
County1 2 M 2 0
收件人:
Geography Count
County1 15
County2 23
如果整个文件可以放入内存但使用 pandas.read_csv()
会出现 MemoryError
,这将是一件简单的事情。所以我一直在研究其他方法,似乎有很多选择——HDF5?使用 itertools
(这看起来很复杂 - 生成器?)或者只是使用标准文件方法读取第一个地理区域(70 行),对计数列求和,然后在加载另外 70 行之前写出。
有人对执行此操作的最佳方法有任何建议吗?我特别喜欢流式传输数据的想法,尤其是因为我可以想到很多其他有用的地方。我对这种方法或类似地使用可能的最基本功能的方法最感兴趣。
编辑:在这个小案例中,我只想要按地理位置统计的总和。但是,如果我可以读入一个 block ,指定任何函数(比如,将 2 列加在一起,或者按地理位置取一列的最大值),应用函数,并在读入新 block 之前写入输出,那将是理想的.
最佳答案
您可以使用 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')
或者,如果 pandas
是必需的,您可以使用分 block 读取,如@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')
关于python - 如何在 python 中流入和操作大数据文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38208389/