【问题标题】:Best and efficient way to concat or append huge multiple xlsx files in pandas在 pandas 中连接或附加大量 xlsx 文件的最佳和有效方法
【发布时间】:2021-05-28 01:26:05
【问题描述】:

熊猫新手在自学方面取得了一些进展,所以我想要最好和最有效的方法来处理这个问题:

我有 3 个有时超过 3 个 excel 文件“.xlsx”,每个文件大约 100MB,每个文件至少 800K 记录和 200 列。

文件完全共享相同的列,它们被拆分,因为它们是从无法处理所有合并的系统中导出的。

我想在一个数据帧中加载文件,打开每个文件然后concatappend 我知道这将取决于机器的内存,但我正在寻找处理这些文件和控制的最佳方法它们在一帧中。

这就是我所拥有的:

start = timeit.default_timer()

all_data = pd.DataFrame()
for f in glob.glob("./data/*.xlsx"):
    df = pd.read_excel(f)
    all_data = all_data.append(df,ignore_index=True)

    
all_data

stop = timeit.default_timer()
execution_time = stop - start

print (execution_time)

使用 append 加载 df all_data 中的文件大约需要 7 分钟

有没有最好的方法在更短的时间内加载它们?

【问题讨论】:

  • 加载文件并写入sql ?更多信息stackoverflow.com/questions/28766133/…
  • 将每个数据帧读入数据帧列表,然后在整个帧列表上调用一次conact,而不是按顺序追加会显着提高性能。
  • @HenryEcker 我将其中一个文件保存为.csv,大小几乎翻了一番,但比.xlsx 快。在将xlsx 读取到数据帧之前,是否有特定的函数可以将xlsx 处理为csv?数据丢失的可能性有多大?谢谢
  • 我不是问这个问题的人。我不经常使用电子表格。我确实做了相当多的 pandas 基准测试,这就是为什么我知道for append 的性能明显比列表中的单个concat 差。但在将您的数据转换为更有用的格式或从 xlsx 转换为 csv 等方面,这可能不是领域。

标签: python pandas dataframe


【解决方案1】:

您可以使用multiprocessing 来提高加载速度并使用concat 合并所有dfs:

import pandas as pd
import multiprocessing
import glob
import time


def read_excel(filename):
    return pd.read_excel(filename)


if __name__ == "__main__":
    files = glob.glob("./data/*.xlsx")

    print("Sequential")
    print(f"Loading excel files: {time.strftime('%H:%M:%S', time.localtime())}")
    start = time.time()
    data = [read_excel(filename) for filename in files]
    end = time.time()
    print(f"Loaded excel files in {time.strftime('%H:%M:%S', time.gmtime(end-start))}")
    df_sq = pd.concat(data).reset_index(drop=True)

    print("Multiprocessing")
    with multiprocessing.Pool(multiprocessing.cpu_count()) as pool:
        print(f"Loading excel files: {time.strftime('%H:%M:%S', time.localtime())}")
        start = time.time()
        data = pool.map(read_excel, files)
        end = time.time()
        print(f"Loaded excel files in {time.strftime('%H:%M:%S', time.gmtime(end-start))}")
        df_mp = pd.concat(data).reset_index(drop=True)

示例:50 个 25MB 的文件(增益 2 倍)

Sequential
Loading excel files: 09:12:17
Loaded excel files in 00:00:14
Multiprocessing
Loading excel files: 09:12:33
Loaded excel files in 00:00:07

【讨论】:

  • Sequential Loaded excel files in 00:03:32 Multiprocessing Loaded excel files in 00:01:31
猜你喜欢
  • 2018-09-11
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
  • 2022-01-03
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多