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

时间:2019-04-16 04:26:24

标签: python excel pandas dataframe

我大约有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文件的所有工作表吗?

3 个答案:

答案 0 :(得分:2)

使用read_excel中的sheet_name=None来计算从所有工作表名称创建的DataFrame的返回顺序,然后由concat和最后一个DataFrame.append连接到最后一个DataFrame:< / p>

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)

答案 1 :(得分:1)

如果我正确理解了您的问题,请在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)

答案 2 :(得分:0)

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

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