【问题标题】:Create dataframes in for loop from multiple Excel workbooks based on worksheet name?根据工作表名称从多个 Excel 工作簿中创建 for 循环中的数据框?
【发布时间】:2018-02-04 00:47:09
【问题描述】:

我有一个包含数百个 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,同时根据它们来自的工作表命名它们?

【问题讨论】:

    标签: python excel pandas for-loop dataframe


    【解决方案1】:

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

    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
    

    【讨论】:

    • “df_list”是指字典键列表吗?我用list(dict.fromkeys(sheet_names)) 创建了df_list 但得到一个'NoneType' 对象没有属性'append' 错误。
    【解决方案2】:

    您可以利用这样一个事实:如果您将工作表名称的list 传递给pd.read_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_names 的元素。它的值是文件中相应工作表名称的串联数据框。

    我希望这会有所帮助。

    【讨论】:

    • 谢谢;这就是我一直在寻找的。​​span>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多