连接 excel 文件中的所有工作表,其中一些具有不同的 skiprows 标准

concatenate all sheets in the excel file, some of which have a different skiprows criteria

我有一个 Excel 工作簿,里面有 8 sheet 个。它们都遵循相同的列 header 结构。唯一的区别是,第一个 sheet 从第 1 行开始,而其余的 sheet 从第 4 行开始。

我正在尝试 运行 这样的命令,但这给了我错误的数据 - 我认识到因为我写了 sheet_name=None 这会给我带来问题,因为 sheets 从不同的行开始:

df = pd.concat(pd.read_excel(xlsfile, sheet_name=None, skiprows=4), sort=True)

我的下一次尝试是:

frames = []
df = pd.read_excel(xlsfile, sheet_name='Questionnaire')
for sheet in TREND_SHEETS:
    tmp = pd.read_excel(xlsfile, sheet_name=sheet, skiprows=4)
    # append tmp dynamically to frames, then use concat frames at the end.. ugly
    df.append(tmp, sort=False)

return df

注意,Questionnaire 是 Excel 工作簿中的第一个 sheet。我知道这里的逻辑是关闭的,我不想创建包含 'tmp' 的动态变量,将其附加到列表,然后连接帧。

我该如何解决这个问题,以便获得一个包含所有 sheet 数据的数据框?

我要做的是有一个配置文件,比如一个 python 字典,以工作表名称作为键,值可以是要跳过的 number_of_rows:

已编辑:感谢@parfait 提供更好的解决方案,最好在 for 循环之外连接,因为它的内存效率更高。您可以做什么将 dfs 附加到 for 循环内的列表,然后在外部连接。

import pandas as pd
sheets = {
    'Sheet1': 1,
    'Sheet2': 4,
    'Sheet3': 4,
    'Sheet4': 4
}

list_df = list()
for k, v in sheets.items():
    tmp = pd.read_excel(xlsfile, sheetname=k, skiprows=v)
    list_df.append(tmp)


final_df = pd.concat(list_df, ignore_index=True)

希望对您有所帮助!

考虑列表理解来构建数据帧列表,以便在循环外连接 一次。借用@Carson的字典做法:

sheets = {'sheet1': 1, 'sheet2': 4, 'sheet3': 4, 'sheet4': 4}

df_list = [pd.read_excel(xlsfile, sheetname=k, skiprows=v) \
              for k,v in sheets.items()]

final_df = pd.concat(df_list, ignore_index=True)