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

我有一个大的电子表格文件(.xlsx),我正在使用python熊猫处理。碰巧,我需要数据从两个选项卡(表)在那个大文件。其中一个选项卡包含大量数据,而另一个选项卡只有几个方形单元格。

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

我如何只加载特定的表与pd.read_excel()?

709227 次浏览

试试pd.ExcelFile:

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

正如@HaPsantran所指出的,整个Excel文件在ExcelFile()调用期间被读入(似乎没有绕过这个的方法)。这只是让你不必每次访问新工作表时都读取相同的文件。

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

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

你也可以使用表的索引:

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

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

sheet2 = xls.parse(1)

你也可以指定表名作为参数:

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

将只上传表"sheet_name"

有以下几种选择:

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

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: string, int, mixed list of strings/int, or None, default 0 0.21.0版后已移除:使用sheet_name代替来源链接

是的,不幸的是,它总是加载完整的文件。如果重复执行此操作,最好提取表以分离csv,然后分别加载。你可以用d6tstack自动化这个过程,它还添加了额外的功能,比如检查所有表或多个Excel文件中的所有列是否相等。

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

看到d6tstack Excel示例

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。

如果你已经将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()

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

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

如果:

  • 您需要多个工作表,但不是全部
  • 你需要一个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

根据用例有不同的选项:

  1. 如果一个人不知道床单的名字。

  2. 如果表名不相关。

  3. 如果有人知道床单的名字。

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

有关查找表名等信息,请参阅Notes部分。


选项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的文件夹中,一种方法是使用r'./Data/FILENAME.xlsx'创建一个变量,如下面的path

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

df = pd.read_excel('FileName.xlsx', 'SheetName')

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

你可以用下面几行来阅读所有的表格

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)