python将多个excel中的所有工作表附加到pandas数据框中的有效方法

Posted

技术标签:

【中文标题】python将多个excel中的所有工作表附加到pandas数据框中的有效方法【英文标题】:python efficient way to append all worksheets in multiple excel into pandas dataframe 【发布时间】:2019-09-06 02:33:02 【问题描述】:

我有大约 20++ xlsx 文件,每个 xlsx 文件中可能包含不同数量的工作表。但谢天谢地,所有列都是所有工作表和所有 xlsx 文件中的一部分。通过引用here",我有了一些想法。我一直在尝试几种方法将所有 excel 文件(所有工作表)导入并附加到单个数据框(大约 400 万行记录)中。

注意:我也检查了here",但它只包括文件级别、我的构成文件和工作表级别。

我试过下面的代码

# import all necessary package
import pandas as pd
from pathlib import Path
import glob
import sys

# set source path
source_dataset_path = "C:/Users/aaa/Desktop/Sample_dataset/"
source_dataset_list = glob.iglob(source_dataset_path + "Sales transaction *")

for file in source_dataset_list:
#xls = pd.ExcelFile(source_dataset_list[i])
    sys.stdout.write(str(file))
    sys.stdout.flush()
    xls = pd.ExcelFile(file)
    out_df = pd.DataFrame() ## create empty output dataframe

    for sheet in xls.sheet_names:
        sys.stdout.write(str(sheet))
        sys.stdout.flush() ## # View the excel files sheet names
        #df = pd.read_excel(source_dataset_list[i], sheet_name=sheet)
        df = pd.read_excel(file, sheetname=sheet)
        out_df = out_df.append(df)  ## This will append rows of one dataframe to another(just like your expected output)

问题:

我的方法是首先读取每个 excel 文件并获取其中的工作表列表,然后加载工作表并附加所有工作表。循环似乎不是很有效,特别是当每次追加的数据大小都增加时。

还有其他有效的方法可以从多个 excel 文件中导入和追加所有工作表吗?

【问题讨论】:

嗨@run-out 感谢您的评论,我已经检查了链接,并且我之前已经阅读过,它只附加到文件级别而不是工作表级别。 【参考方案1】:

如果您想阅读所有表格,我有一个非常直接的解决方案。

import pandas as pd
df = pd.concat(pd.read_excel(path+file_name, sheet_name=None), 
               ignore_index=True)

【讨论】:

【参考方案2】:

read_excel 中使用sheet_name=None 返回从所有工作表名称创建的DataFrames 的orderdict,然后通过concat 和最后一个DataFrame.append 连接到最终DataFrame

out_df = pd.DataFrame()
for f in source_dataset_list:
    df = pd.read_excel(f, sheet_name=None)
    cdf = pd.concat(df.values())
    out_df = out_df.append(cdf,ignore_index=True)

另一种解决方案:

cdf = [pd.read_excel(excel_names, sheet_name=None).values() 
            for excel_names in source_dataset_list]

out_df = pd.concat([pd.concat(x) for x in cdf], ignore_index=True)

【讨论】:

嗨@jezrael 感谢您的评论,我尝试使用真实数据集(12 个 excel 文件总共包含 65 个工作表)。两个代码的运行时间均为 1092.280912.008 秒。 您的第二个解决方案似乎更有效 :) 谢谢! 我发现pd.read_excel(f, sheet_name=None) 不起作用,正确的方法应该是pd.read_excel(f, sheetname=None)sheetname 没有下划线 @yc.koong - 嗯,这取决于熊猫的版本,在最后一个使用sheet_name,在以前的sheetname【参考方案3】:

如果我正确理解您的问题,请将sheet_name=None 设置为pd.read_excel 即可。

import os
import pandas as pd

path = "C:/Users/aaa/Desktop/Sample_dataset/"

dfs = [
    pd.concat(pd.read_excel(path + x, sheet_name=None))
    for x in os.listdir(path)
    if x.endswith(".xlsx") or x.endswith(".xls")
]

df = pd.concat(dfs)

【讨论】:

嗨@pythonjokeun,感谢您的评论,我尝试编辑您的代码以满足我的情况,将if x.endswith(".xlsx") or x.endswith(".xls")更改为if "Sales transaction" in x。我尝试在真实数据集上运行(12 个 excel 文件总共包含 65 个工作表,大约 400 万行记录),总运行时间为1040.364 秒。 :)

以上是关于python将多个excel中的所有工作表附加到pandas数据框中的有效方法的主要内容,如果未能解决你的问题,请参考以下文章

将多个文本文件合并到一个Excel工作表中

无法将熊猫数据框附加到现有的 Excel 工作表

将不同文件中的多个excel表导入python并将它们连接到一个数据框中

用python将两个excel文件中的所有工作表复制到一个新的excel?

将多个工作表 Excel 上传到内部表中

将同一工作簿中的多个 Excel 工作表复合到一张工作表中