根据工作表名称从多个Excel工作簿中为for循环创建数据帧?

时间:2017-08-25 22:57:23

标签: python excel pandas for-loop dataframe

我有一个包含几百个Excel文件的文件夹,所有这些文件的组织相同,每个工作簿中有九个页面。我正在运行以下代码来迭代文件并为所有工作簿中的每个工作表创建一个数据框(因此数据框“sheet_a_df”将从连接到单个数据框的每个工作簿中的工作表“a”)。

sheet_a_df = pd.DataFrame()
for file in glob.glob('C:\\Users\*.xlsx'):
    df = pd.read_excel(file,sheetname='a')
    sheet_1_df = sheet_1_df.append(df,ignore_index=True).dropna()

sheet_b_df = pd.DataFrame()
for file in glob.glob('C:\\Users\\*.xlsx'):
    df = pd.read_excel(file,sheetname='b')
    sheet_b_df = sheet_b_df.append(df,ignore_index=True).dropna()

# And so on for all nine sheet names...

但是,这需要复制和粘贴代码九次(每张一次)。

有更合适的方法吗?

回顾this question,我理解字典是在for循环中创建多个数据帧的方法。我也试图根据工作表的名称​​命名每个df 。我创建了一个工作表名称列表并尝试了以下代码,但我得到的KeyError只返回第一个工作表的名称。

sheet_names = ['a',
               'b',
               'c',
               ...,]

df_dict = {}

for file in glob.glob('C:\\Users\*.xlsx'):
    for sheet in sheet_names:
        df = pd.read_excel(file,sheetname=sheet)
        df_dict[sheet] = df_dict[sheet].append(df)

有没有办法修复上面的代码来创建所有九个dfs,同时根据它们的来源命名它们?

2 个答案:

答案 0 :(得分:0)

您正尝试将数据框附加到不存在的字典项。您应该首先检查密钥是否存在:

for file in glob.glob('C:\\Users\*.xlsx'):
    for sheet in sheet_names:
        df = pd.read_excel(file,sheetname=sheet)
        if sheet in df_dict:
            df_dict[sheet] = df_dict[sheet].append(df)
        else:
            df_dict[sheet] = df

答案 1 :(得分:0)

您可以利用以下事实:如果您将CPU工作表名称传递给list函数的sheetname参数,它将返回数据框的字典,其中包含密钥是工作表名称,值是与这些工作表名称对应的数据框。因此,以下内容应该为您提供连接数据帧的字典:所有“a”数据帧在一起,所有“b”数据帧在一起,依此类推。

pd.read_excel

现在sheet_names = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'] data = {} for fn in glob.glob('C:\\Users\*.xlsx'): dfs = pd.read_excel(fn, sheetname=sheet_names) for k in dfs: data.setdefault(k, pd.DataFrame()) data[k] = pd.concat([data[k], dfs[k]]) 应该是数据框架的字典,其中的键包含来自data的元素。它的值是文件中相应工作表名称的连接数据框。

我希望这会有所帮助。