提问者:小点点

将多个Excel文件加载到Pandas中


我在多个(子)文件夹中有大约5400个Excel文件,希望将它们加载到单个数据框中。这些文件只有一个工作表,每个工作表最多可以有2000行。总行数预计为200万或更多。

我的电脑有SSD硬盘和8GB内存,速度非常快。不过,这需要几个小时才能完成。我的代码有什么问题吗?如果有任何提示,我将不胜感激。

%%time
files = glob.glob('asyncDatas/**/*.xlsx',recursive=True)

df = pd.DataFrame()

for num, fname in enumerate(files, start=1):
    print("File #{} | {}".format(num, fname))
    if len(fname) > 0:
        data = pd.read_excel(fname, 'Sheet0', index_col='Time', skiprows=3)
        df = df.append(data)

df.head()

我的预感是。append方法花费了太多时间,因为它可能是动态重新分配内存?Conconat()可能是更好的方法吗?


共2个答案

匿名用户

首先附加到DataFrames列表中,最后只添加一次concat,但仍然不确定8GB RAM是否足够(但我希望如此):

dfs = []

for num, fname in enumerate(files, start=1):
    print("File #{} | {}".format(num, fname))
    if len(fname) > 0:
        data = pd.read_excel(fname, 'Sheet0', index_col='Time', skiprows=3)
        dfs.append(data)

df = pd.concat(dfs, ignore_index=True)

匿名用户

将Excel数据加载到Pandas是出了名的慢。第一个选项是在jezrael描述的数据帧列表中使用pd.concat一次。

否则,您有两个选择:

  1. 在Python之外有效地将您的Excel文件转换为CSV。例如,请参阅此答案。熊猫读取CSV文件的性能更好。如果您转换为csv.gz(gzip),您可能会看到额外的改进。
  2. 考虑分类数据以改进内存管理;分块;或通过库的懒惰操作。有关更多详细信息,请参阅此答案。

如果您的工作流程涉及“多次阅读”,我强烈建议您从Excel转换为更适合熊猫的格式,如CSV、HDF5或泡菜。