【问题标题】:Loading multiple Excel files into Pandas将多个 Excel 文件加载到 Pandas 中
【发布时间】:2018-11-22 00:13:07
【问题描述】:

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

我的电脑有 SSD HD 和 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 方法需要太多时间,因为它可能是动态重新分配内存? .concat() 可能是更好的方法吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    首先附加到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)
    

    【讨论】:

    • 成功了。谢谢!仅供参考:数据框使用大约 2.4GB。所有文件在 20 分钟内加载完毕。
    【解决方案2】:

    众所周知,将 Excel 数据加载到 Pandas 中的速度非常慢。您的第一个选择是在数据框列表as described by jezrael 上使用一次pd.concat

    否则,您有两种选择:

    1. 在 Python 之外高效地将 Excel 文件转换为 CSV。例如,请参阅this answer。 Pandas 可以更好地读取 CSV 文件。如果您转换为 csv.gz (gzipped),您可能会看到额外的改进。
    2. 考虑分类数据以改进内存管理;分块;或通过库的惰性操作。请参阅this answer 了解更多详情。

    如果您的工作流程涉及“多次阅读”,我强烈建议您将 Excel 转换为对 Pandas 更友好的格式,例如 CSV、HDF5 或 Pickle。

    【讨论】:

    • 谢谢,jpp!感谢您的回复。
    猜你喜欢
    • 2017-06-16
    • 2016-07-27
    • 1970-01-01
    • 2018-04-03
    • 2015-07-17
    • 2019-04-03
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多