代码之家  ›  专栏  ›  技术社区  ›  sgerbhctim

连接Excel文件中的所有工作表,其中一些工作表具有不同的skiprows条件

  •  0
  • sgerbhctim  · 技术社区  · 5 年前

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

    我试图运行这样的命令,但这给了我错误的数据-我认识到这是因为我写了 sheet_name=None 当工作表从不同的行开始时,这将给我带来问题:

    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工作簿中的第一个工作表。我知道这里的逻辑是关闭的,我不想创建保存“tmp”的动态变量,将其附加到列表中,然后连接帧。

    我如何解决这个问题,以实现一个包含所有工作表数据的数据框架?

    2 回复  |  直到 5 年前
        1
  •  3
  •   Parfait    5 年前

    考虑使用列表理解来构建用于连接的数据帧列表 一旦 在环外。借用@carson's dictionary方法:

    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)
    
        2
  •  3
  •   Jenobi    5 年前

    我要做的是有一个配置文件,就像一个以sheetname为键的python字典,值可以是要跳过的行数\u:

    编辑:感谢@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)
    

    希望这有帮助!