使用 Pandas 对同一工作簿的多个工作表进行pd.read_excel()

Using Pandas to pd.read_excel() for multiple worksheets of the same workbook

提问人:HaPsantran 提问时间:10/23/2014 最后编辑:smciHaPsantran 更新时间:10/12/2023 访问量:891616

问:

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

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

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

python excel 熊猫 数据帧 xlsx

评论

0赞 neosergio 2/19/2021
我在另一篇文章中举了一个例子:stackoverflow.com/a/66280555/778261

答:

584赞 Noah 10/23/2014 #1

试试 pd。Excel文件

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

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

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

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

评论

7赞 HaPsantran 11/19/2016
FWIW,看起来(上次我测试过)所有东西的第一行加载,所以没有办法有效地只拉入一张纸,但至少获得多张纸不需要整张纸的多次加载。
3赞 DStauffman 12/15/2017
这个答案已被 pandas 弃用,现在在 v0.21.0 中对我来说崩溃了。它应该被@Mat0kan给出的那个所取代。
4赞 Noah 12/16/2017
@DStauffman 这对我来说仍然很好用,我从代码或文档中没有看到任何迹象表明它已被弃用。如果您遇到问题,我会在 github 上提交 pandas 或 xlrd(pandas 使用的 python excel 解析库)的问题
3赞 Eme Eme 3/18/2021
只是提个醒。. 使用 xlrd,但自 2020 年 12 月起,xlrd 不再支持 xls 或 xlsx 文件。你可以通过以下方式解决这个问题pd.ExcelFilexls = pd.ExcelFile('path_to_file.xls' engine='openpyxl')
2赞 Noah 3/23/2021
@EmeEme 仅供参考 较新版本的 Pandas 默认使用 OpenPyXL
45赞 Elliott 2/26/2015 #2

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

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

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

sheet2 = xls.parse(1)

评论

9赞 Stefano Fedele 2/26/2017
如果您想要工作表名称列表,只需键入xls.sheet_names
45赞 Mat0kan 2/12/2017 #3

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

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

将仅上传工作表。"sheet_name"

260赞 Vikash Singh 9/7/2017 #4

有几个选项:

将所有工作表直接阅读到有序的词典中。

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耳机指出版本问题。

sheetname : string, int, strings/ints 的混合列表,或 None,默认 0 自 0.21.0 版起已弃用:请改用 sheet_name 源链接

评论

26赞 ihightower 10/31/2017
在我拥有的最新熊猫(0.20.3)中,将所有工作表读取到地图。所需要的只是,这将自动将工作表放在字典中。.并像这样访问工作表作为数据帧:df_sheet_map = pd.read_excel(file_fullpath, sheetname=None)df_sheet_map['house']
0赞 Daneel R. 7/7/2021
@ihightower 不过,这是一本字典,而不是地图。我现在回答是因为我一直在为这个功能而苦苦挣扎,因为在最新版本的 pandas 中,他们放弃了对 kwargs 的支持read_excel而我正试图绕过它
2赞 citynorman 12/17/2018 #5

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

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

请参阅 d6tstack Excel 示例

15赞 Ashu007 8/2/2019 #6
pd.read_excel('filename.xlsx') 

默认情况下,读取工作簿的第一张。

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

阅读工作簿的特定工作表并

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

将所有工作表从 Excel 读取到 Pandas DataFrame,因为 OrderedDict 表示嵌套数据帧,所有工作表都作为数据帧收集在 DataFrame 中,其类型为 OrderedDict。

2赞 Nikita Agarwala 1/13/2020 #7

如果您已将 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()
15赞 anujsyal 8/11/2020 #8

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

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

评论

0赞 Himanshu 7/17/2023
在这种情况下,您将如何对特定于工作表的数据进行切片?因为我们没有任何工作表名称列。
5赞 CreekGeek 8/18/2020 #9

如果:

  • 您需要多个(但不是全部)工作表,并且
  • 您需要单个 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

评论

0赞 Evan 7/23/2022
我认为这应该是公认的答案!如果您只有几张纸要阅读,也可以使用元组解包。df1, df2 = pd.read_excel(filepath, sheet_name=["sheet1", "sheet2"]).values()
31赞 Gonçalo Peres 11/24/2020 #10

根据用例,有多种选项:

  1. 如果一个人不知道工作表名称。

  2. 如果工作表名称不相关。

  3. 如果知道床单的名称。

下面我们将仔细研究每个选项。

有关查找工作表名称等信息,请参阅“注释”部分。


选项 1

如果不知道工作表名称

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

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

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

选项 2

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

# Read all sheets in your File
df = pd.read_excel('FILENAME.xlsx', sheet_name=None)

sheet1 = list(df.keys())[0]

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

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

选项 3

在这里,我们将考虑知道工作表名称的情况。 对于示例,将考虑有三个工作表,分别名为 、 和 。每个内容都是一样的,看起来像这样Sheet1Sheet2Sheet3

     0         1     2
0   85   January  2000
1   95  February  2001
2  105     March  2002
3  115     April  2003
4  125       May  2004
5  135      June  2005

有了这个,根据一个人的目标,有多种方法:

  • 将所有内容存储在同一个数据帧中。一种方法是按如下方式连接工作表

    sheets = ['Sheet1', 'Sheet2', 'Sheet3']
    df = pd.concat([pd.read_excel('FILENAME.xlsx', sheet_name = sheet) for sheet in sheets], ignore_index = True)
    
    [Out]:
    
          0         1     2
    0    85   January  2000
    1    95  February  2001
    2   105     March  2002
    3   115     April  2003
    4   125       May  2004
    5   135      June  2005
    6    85   January  2000
    7    95  February  2001
    8   105     March  2002
    9   115     April  2003
    10  125       May  2004
    11  135      June  2005
    12   85   January  2000
    13   95  February  2001
    14  105     March  2002
    15  115     April  2003
    16  125       May  2004
    17  135      June  2005
    

    基本上,这是pandas.concat的工作方式(来源):

    enter image description here

  • 将每个工作表存储在不同的数据帧中(假设,,,...)df1df2

    sheets = ['Sheet1', 'Sheet2', 'Sheet3']
    
    for i, sheet in enumerate(sheets):
        globals()['df' + str(i + 1)] = pd.read_excel('FILENAME.xlsx', sheet_name = sheet)
    
    [Out]:
    
    # df1
         0         1     2
    0   85   January  2000
    1   95  February  2001
    2  105     March  2002
    3  115     April  2003
    4  125       May  2004
    5  135      June  2005
    
    # df2
         0         1     2
    0   85   January  2000
    1   95  February  2001
    2  105     March  2002
    3  115     April  2003
    4  125       May  2004
    5  135      June  2005
    
    # df3
         0         1     2
    0   85   January  2000
    1   95  February  2001
    2  105     March  2002
    3  115     April  2003
    4  125       May  2004
    5  135      June  2005
    

笔记:

  • 如果想知道工作表名称,可以使用 ExcelFile 类,如下所示

    sheets = pd.ExcelFile('FILENAME.xlsx').sheet_names
    
    [Out]: ['Sheet1', 'Sheet2', 'Sheet3']
    
  • 在本例中,假设该文件与正在运行的脚本位于同一目录中。FILENAME.xlsx

    • 如果文件位于当前目录的名为 Data 的文件夹中,一种方法是使用 create 变量,如下所示r'./Data/FILENAME.xlsx'path

       path = r'./Data/Test.xlsx'
      
       df = pd.read_excel(r'./Data/FILENAME.xlsx', sheet_name=None)
      
  • 这可能是一本相关的读物。

4赞 Tajinder 6/27/2021 #11
df = pd.read_excel('FileName.xlsx', 'SheetName')

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

5赞 Pratyush Tripathy 9/1/2021 #12

您可以使用以下行阅读所有工作表

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)

评论

0赞 outcast_dreamer 4/22/2022
您可能希望在末尾添加 .reset_index(drop=True),以防您不希望每个工作表使用不同的索引号。
0赞 imvickykumar999 6/17/2023 #13

DF 将是一个列表,其中包含每个工作表作为每个索引中的数据帧。

import pandas as pd

your_file = 'your_file.xlsx'
sh = pd.read_excel(your_file, sheet_name=None)

name = list(sh.keys())
df = []

for i in range(len(name)):
  df.append(pd.read_excel(your_file, name[i]))
0赞 Aashutosh Kumar 10/12/2023 #14

使用 Excel 文件中读取单个工作表read_excel

df = pd.read_excel(config_file, sheet_name = 'euro-currency-rates')

从 Excel 文件中读取多个工作表

excel_df    = pd.read_excel(self.excel_file, sheet_name=[0, 1, 2])          # Read 1st, 2nd, 3rd Sheets, Returns a Dictionary with each key number 0,1,2 and each corresponding values sheet data frame
# excel_df  = pd.read_excel(self.excel_file, sheet_name=['sheetA', 'sheetB', 'sheetC'])
# excel_df  = pd.read_excel(self.excel_file, sheet_name=None)       # Read All sheets
sheet1_df   = excel_df[0]
sheet2_df   = excel_df[1]
sheet3_df   = excel_df[2]