我有一个相对较大(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行),对count列求和,然后在加载到另一个70行之前写出。
有人对最好的方法有什么建议吗?我特别喜欢数据流的想法,特别是因为我可以想到很多其他地方,这将是有用的。我最感兴趣的是这个方法,或者类似地使用最基本的功能。
编辑:在这种小情况下,我只需要按地理位置计算的总和。但是,如果我能够读入一个块,指定任何函数(比如,将两列相加,或者按地理位置取一列的最大值),应用该函数,并在读入一个新块之前写入输出,那将是理想的。
您可以使用^{} ,这在语法上与
pandas
类似,但在核心之外执行操作,因此内存不应该是问题:或者,如果
pandas
是一个需求,那么可以使用@chrisaycock提到的分块读取。您可能需要尝试chunksize
参数。我确实喜欢@root的解决方案,但我会进一步优化内存使用率—只在内存中保留聚合的DF,只读取那些列,这是您真正需要的:
测试数据:
输出.csv:
PS使用这种方法可以处理大量文件。
除非您需要对数据进行排序,否则使用分块方法的PPS应该可以工作——在本例中,我将使用经典的UNIX工具,如
awk
、sort
等,首先对数据进行排序我还建议使用PyTables(HDF5存储),而不是CSV文件-它非常快,允许有条件地读取数据(使用
where
参数),因此它非常方便,节省了大量资源,通常与CSV相比much faster。相关问题 更多 >
编程相关推荐