我需要读取数千个csv文件,并将它们输出为Python中的单个csv文件。
每个原始文件将用于在最终输出中创建单行,列是对原始文件行的一些操作。
由于文件的大小太大,处理这些文件需要很多小时,而且无法完全加载到内存中。
我能够读取每个csv并将其从内存中删除,以解决RAM问题。然而,我目前正在迭代地读取和处理每个csv(在Pandas中(,并将输出行附加到最终的csv,这似乎很慢。我相信我可以使用多处理库让每个进程读取并处理自己的csv,但不确定是否有比这更好的方法。
在有RAM限制的情况下,用Python完成这项工作的最快方法是什么?
例如,ABC.csv和DEF.csv将被读取并处理为最终输出csv中的各个行。(实际文件将有几十列和数十万行(
ABC.csv:
id,col1,col2
abc,2.3,3
abc,3.7,5
abc,3.0,9
DEF.csv:
id,col1,col2
def,1.9,3
def,2.8,2
def,1.6,1
最终输出:
id,col1_avg,col2_max
abc,3.0,9
def,2.1,3
我建议使用dask
。它是一个允许您对大型数据集进行并行处理的库。
import dask.dataframe as dd
df = dd.read_csv('*.csv')
df = df.groupby('id').agg({'col1': 'mean', 'col2': 'max'})
df.to_csv('output.csv')
代码说明
dd.read_csv
将读取当前目录中的所有csv文件,并将它们连接到单个数据帧中。
df.groupby('id').agg({'col1': 'mean', 'col2': 'max'})
将根据id
列对数据帧进行分组,然后计算每组的col1
的平均值和col2
的最大值。
df.to_csv('output.csv')
将数据帧写入csv文件。
性能
我在我的机器上用一个包含10000个csv文件的目录进行了测试,每个文件有10000行。代码运行大约需要2分钟。
安装
要安装dask
,请运行pip install dask
。