我有一个相对较大(1 GB)的文本文件,我想通过跨类别求和来减小其大小:
Geography AgeGroup Gender Race Count
County1 1 M 1 12
County1 2 M 1 3
County1 2 M 2 0
To:
Geography Count
County1 15
County2 23
如果整个文件可以放入内存但使用pandas.read_csv()
gives MemoryError
。所以我一直在研究其他方法,似乎有很多选择 - HDF5?使用itertools
(这看起来很复杂 - 生成器?)或者只是使用标准文件方法读取第一个地理区域(70 行),对计数列求和,然后在加载另外 70 行之前写出。
有人对执行此操作的最佳方法有任何建议吗?我特别喜欢流式传输数据的想法,特别是因为我可以想到很多其他地方这会很有用。我对这种方法最感兴趣,或者类似地使用最基本的功能的方法。
Edit:在这个小案例中,我只想要按地理位置计算的总和。但是,如果我可以读取一个块,指定任何函数(例如,将 2 列添加在一起,或按地理位置取一列的最大值),应用该函数,并在读取新块之前写入输出,那将是理想的选择。
您可以使用dask.dataframe http://dask.pydata.org/en/latest/dataframe.html,在语法上类似于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
正如 @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')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)