【问题标题】:Using Pandas to pd.read_excel() for multiple worksheets of the same workbook使用 Pandas 对同一工作簿的多个工作表进行 pd.read_excel()
【发布时间】:2014-12-18 17:14:24
【问题描述】:

我有一个使用 python pandas 处理的大型电子表格文件 (.xlsx)。碰巧我需要来自该大文件中两个选项卡(工作表)的数据。其中一个选项卡有大量数据,另一个只有几个方形单元格。

当我在 any 工作表上使用 pd.read_excel() 时,在我看来,整个文件都已加载(不仅仅是我感兴趣的工作表)。因此,当我使用该方法两次(每张工作表一次)时,我实际上不得不忍受整个工作簿被读取两次(即使我们只使用指定的工作表)。

如何只加载带有pd.read_excel() 的特定工作表?

【问题讨论】:

标签: python excel pandas dataframe xlsx


【解决方案1】:

试试pd.ExcelFile:

xls = pd.ExcelFile('path_to_file.xls')
df1 = pd.read_excel(xls, 'Sheet1')
df2 = pd.read_excel(xls, 'Sheet2')

正如@HaPsantran 所述,在ExcelFile() 调用期间会读入整个Excel 文件(似乎没有办法解决这个问题)。这只是让您不必在每次想要访问新工作表时读取相同的文件。

请注意,pd.read_excel()sheet_name 参数可以是工作表名称(如上)、指定工作表编号的整数(例如 0、1 等)、工作表名称或索引列表,或者None。如果提供了一个列表,它会返回一个字典,其中键是工作表名称/索引,值是数据框。默认是简单地返回第一张表(即sheet_name=0)。

如果指定了None,则返回所有工作表,作为{sheet_name:dataframe}字典。

【讨论】:

  • FWIW,看起来(上次我测试它)第一行加载在 everything 中,所以没有办法有效地拉入一张纸,但至少获取多张工作表不需要多次加载整个工作表。
  • 这个答案已被 pandas 弃用,现在在 v0.21.0 中为我崩溃。它应该由@Mat0kan 给出的替换。
  • @DStauffman 这对我来说仍然可以正常工作,我从代码或文档中看不到任何迹象表明它已被弃用。如果您遇到问题,我会在 github 上为 pandas 或 xlrd(pandas 使用的 python excel 解析库)提交问题
  • @Noah,谢谢,我对此进行了更多研究,您是对的,只要我使用 sheet_name 而不是 sheetname,它仍然有效。我没有意识到这是已弃用的部分,因为它仍在使用 read_excel 方法,但不在 parse 方法上。
  • 请注意.. pd.ExcelFile 使用 xlrd,但截至 2020 年 12 月,xlrd 不再支持 xls 或 xlsx 文件。您可以通过xls = pd.ExcelFile('path_to_file.xls' engine='openpyxl') 解决此问题
【解决方案2】:

有几个选项:

将所有工作表直接读入有序字典。

import pandas as pd

# for pandas version >= 0.21.0
sheet_to_df_map = pd.read_excel(file_name, sheet_name=None)

# for pandas version < 0.21.0
sheet_to_df_map = pd.read_excel(file_name, sheetname=None)

将第一张表直接读入数据框

df = pd.read_excel('excel_file_path.xls')
# this will read the first sheet into df

读取 excel 文件并获取工作表列表。然后选择并加载工作表。

xls = pd.ExcelFile('excel_file_path.xls')

# Now you can list all sheets in the file
xls.sheet_names
# ['house', 'house_extra', ...]

# to read just one sheet to dataframe:
df = pd.read_excel(file_name, sheet_name="house")

阅读所有工作表并将其存储在字典中。与第一个相同,但更明确。

# to read all sheets to a map
sheet_to_df_map = {}
for sheet_name in xls.sheet_names:
    sheet_to_df_map[sheet_name] = xls.parse(sheet_name)
    # you can also use sheet_index [0,1,2..] instead of sheet name.

感谢@ihightower 指出阅读所有表格的方法,感谢@toto_tico,@red-headphone 指出版本问题。

sheetname:字符串,整数,字符串/整数的混合列表,或无,默认为 0 自 0.21.0 版起已弃用:改用 sheet_name Source Link

【讨论】:

  • 在我拥有的最新熊猫 (0.20.3) 中,将所有工作表读取到地图.. 所需要的只是df_sheet_map = pd.read_excel(file_fullpath, sheetname=None),这将自动将工作表放入字典中.. 和像这样以数据框的形式访问工作表:df_sheet_map['house']
  • @ihightower 这是一本字典,不是地图。我现在回答是因为我一直在努力使用这个功能,因为在最新版本的 pandas 中,他们放弃了对 read_excel 中 kwargs 的支持,我正在尝试解决它
【解决方案3】:

您也可以使用工作表的索引:

xls = pd.ExcelFile('path_to_file.xls')
sheet1 = xls.parse(0)

将给出第一个工作表。对于第二个工作表:

sheet2 = xls.parse(1)

【讨论】:

  • 如果您想要工作表名称列表,而不仅仅是键入 xls.sheet_names
【解决方案4】:

您还可以将工作表名称指定为参数:

data_file = pd.read_excel('path_to_file.xls', sheet_name="sheet_name")

将只上传工作表"sheet_name"

【讨论】:

    【解决方案5】:

    选项 1

    如果不知道表格名称

    # Read all sheets in your File
    df = pd.read_excel('FILENAME.xlsm', sheet_name=None)
        
    # Prints all the sheets name in an ordered dictionary
    print(df.keys())
    

    然后,根据要阅读的工作表,可以将每个工作表传递给特定的dataframe,例如

    sheet1_df = pd.read_excel('FILENAME.xlsm', sheet_name=SHEET1NAME)
    sheet2_df = pd.read_excel('FILENAME.xlsm', sheet_name=SHEET2NAME)
    

    选项 2

    如果名称不相关,并且只关心工作表的位置。假设一个人只想要第一张纸,

    # Read all sheets in your File
    df = pd.read_excel('FILENAME.xlsm', sheet_name=None)
    
    sheet1 = list(df.keys())[0]
    

    然后,根据工作表名称,可以将每个工作表传递给特定的dataframe,例如

    sheet1_df = pd.read_excel('FILENAME.xlsm', sheet_name=SHEET1NAME)
    

    【讨论】:

      【解决方案6】:
      pd.read_excel('filename.xlsx') 
      

      默认阅读第一张工作簿。

      pd.read_excel('filename.xlsx', sheet_name = 'sheetname') 
      

      阅读工作簿的具体工作表并

      pd.read_excel('filename.xlsx', sheet_name = None) 
      

      将所有工作表从excel读取到pandas数据框,作为OrderedDict类型意味着嵌套数据框,所有工作表作为数据框收集在数据框内,其类型为OrderedDict。

      【讨论】:

        【解决方案7】:

        如果您有兴趣阅读所有工作表并将它们合并在一起。最好和最快的方法

        sheet_to_df_map = pd.read_excel('path_to_file.xls', sheet_name=None)
        mdf = pd.concat(sheet_to_df_map, axis=0, ignore_index=True)
        

        这会将所有工作表转换为单个数据框 m_df

        【讨论】:

          【解决方案8】:
          df = pd.read_excel('FileName.xlsx', 'SheetName')
          

          这将从文件FileName.xlsx 中读取工作表SheetName

          【讨论】:

            【解决方案9】:

            您可以使用以下几行阅读所有表格

            import pandas as pd
            file_instance = pd.ExcelFile('your_file.xlsx')
            
            main_df = pd.concat([pd.read_excel('your_file.xlsx', sheet_name=name) for name in file_instance.sheet_names] , axis=0)
            

            【讨论】:

              【解决方案10】:

              如果您已将 excel 文件保存在与您的 python 程序(相对路径)相同的文件夹中,那么您只需提及工作表编号以及文件名。

              例子:

               data = pd.read_excel("wt_vs_ht.xlsx", "Sheet2")
               print(data)
               x = data.Height
               y = data.Weight
               plt.plot(x,y,'x')
               plt.show()
              

              【讨论】:

                【解决方案11】:

                如果:

                • 您需要多个(但不是全部)工作表,并且
                • 你想要一个 df 作为输出

                然后,您可以传递工作表名称列表。您可以手动填充:

                import pandas as pd
                    
                path = "C:\\Path\\To\\Your\\Data\\"
                file = "data.xlsx"
                sheet_lst_wanted = ["01_SomeName","05_SomeName","12_SomeName"] # tab names from Excel
                
                ### import and compile data ###
                    
                # read all sheets from list into an ordered dictionary    
                dict_temp = pd.read_excel(path+file, sheet_name= sheet_lst_wanted)
                
                # concatenate the ordered dict items into a dataframe
                df = pd.concat(dict_temp, axis=0, ignore_index=True)
                

                如果您想要的工作表有一个共同的命名约定,也可以让您与不需要的工作表区分开来,那么可以实现一点自动化:

                # substitute following block for the sheet_lst_wanted line in above block
                
                import xlrd
                
                # string common to only worksheets you want
                str_like = "SomeName" 
                    
                ### create list of sheet names in Excel file ###
                xls = xlrd.open_workbook(path+file, on_demand=True)
                sheet_lst = xls.sheet_names()
                    
                ### create list of sheets meeting criteria  ###
                sheet_lst_wanted = []
                    
                for s in sheet_lst:
                    # note: following conditional statement based on my sheets ending with the string defined in sheet_like
                    if s[-len(str_like):] == str_like:
                        sheet_lst_wanted.append(s)
                    else:
                        pass
                

                【讨论】:

                  【解决方案12】:

                  是的,不幸的是它总是会加载完整的文件。如果您重复执行此操作,最好将工作表提取为单独的 CSV,然后单独加载。您可以使用 d6tstack 自动执行该过程,它还添加了其他功能,例如检查所有工作表或多个 Excel 文件中的所有列是否相等。

                  import d6tstack
                  c = d6tstack.convert_xls.XLStoCSVMultiSheet('multisheet.xlsx')
                  c.convert_all() # ['multisheet-Sheet1.csv','multisheet-Sheet2.csv']
                  

                  d6tstack Excel examples

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2022-12-24
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多