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

Python 根据工作表名称从多个Excel工作簿在for循环中创建数据框?,python,excel,pandas,for-loop,dataframe,Python,Excel,Pandas,For Loop,Dataframe,我有一个包含数百个Excel文件的文件夹,所有文件都以相同的方式组织,每个工作簿中有九张工作表。我正在运行以下代码来迭代文件,并为所有工作簿中的每个工作表创建一个数据框(因此数据框“sheet_a_df”将是连接到单个数据框中的每个工作簿中的工作表“a”) 但是,这需要复制和粘贴代码九次(每张一次) 有没有更合适的方法 通过回顾,我了解字典是在for循环中创建多个数据帧的方法。我还试图根据工作表的名称命名每个df。我创建了一个工作表名称列表,并尝试了以下代码,但得到一个KeyError,它只返回

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

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

有没有更合适的方法

通过回顾,我了解字典是在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,同时根据它们来自的工作表命名它们

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

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

您可以利用这样一个事实:如果将图纸名称的
列表
传递给
pd.read\u excel
函数的
sheetname
参数,它将返回一个数据帧字典,其中键是图纸名称,值是与这些图纸名称对应的数据帧。因此,以下内容应该为您提供一个连接数据帧的字典:所有“a”数据帧放在一起,所有“b”数据帧放在一起,依此类推

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
应该是一个数据帧字典,其中的键包含
sheet\u name
中的元素。其值是文件中相应图纸名称的串联数据帧


我希望这能有所帮助。

所谓的“df_list”是指dict键列表吗?我用
list(dict.fromkeys(sheet\u names))
创建了
df\u列表
,但得到的“NoneType”对象没有属性“append”错误。谢谢;这就是我要找的。
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]])