将Pandas用于pd.read_excel()以获取同一工作簿的多个工作表

HaP*_*ran 119 python excel dataframe pandas

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

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

我使用它错了还是仅限于这种方式?

谢谢!

Noa*_*oah 169

试试pd.ExcelFile:

xls = pd.ExcelFile('path_to_file.xls')
df1 = pd.read_excel(xls, 'Sheet1')
df2 = pd.read_excel(xls, 'Sheet2')
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • FWIW,看起来(我上次测试它)第一行加载*所有*,所以没有办法有效地拉入一张纸,但至少得到多张纸不需要整张纸的多次加载. (4认同)
  • 这个答案已被熊猫弃用,现在在 v0.21.0 中对我来说崩溃了。它应该替换为@Mat0kan 给出的那个。 (3认同)
  • 请注意……`pd.ExcelFile` 使用 xlrd,但截至 2020 年 12 月,xlrd 不再支持 xls 或 xlsx 文件。您可以使用 `xls = pd.ExcelFile('path_to_file.xls' engine='openpyxl')` 来解决这个问题 (3认同)
  • @DStauffman 这对我来说仍然很好用,我从代码或文档中看不到这已被弃用的迹象。如果您遇到问题,我会在 github 上为 pandas 或 xlrd(pandas 使用的 python excel 解析库)提交问题 (2认同)
  • @EmeEme 仅供参考,较新版本的 pandas 默认使用 openpyxl (2认同)

Vik*_*ngh 72

有3种选择:

  1. 将第一张表直接读入数据帧
  2. 阅读excel文件并获取工作表列表.然后选择并加载纸张.
  3. 阅读所有表格并将其存储在字典中.

代码示例:

import pandas as pd

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

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, sheetname="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)
Run Code Online (Sandbox Code Playgroud)

更新:

# @ihightower pointed out in the comments that all sheets can be 
# directly read into an ordered dictionary in 1 step

# 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)
Run Code Online (Sandbox Code Playgroud)

更新2:感谢@toto_tico指出它.

sheetname:string,int,字符串/整数的混合列表,或者None,默认值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']` (9认同)

Ell*_*ott 27

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

xls = pd.ExcelFile('path_to_file.xls')
sheet1 = xls.parse(0)
Run Code Online (Sandbox Code Playgroud)

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

sheet2 = xls.parse(1)
Run Code Online (Sandbox Code Playgroud)

  • 如果您需要工作表名称列表,请输入xls.sheet_names (7认同)

小智 23

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

data_file = pd.read_excel('path_to_file.xls', sheetname="sheet_name")
Run Code Online (Sandbox Code Playgroud)

将仅上传工作表"sheet_name"


Gon*_*ica 11

选项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())
Run Code Online (Sandbox Code Playgroud)

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

sheet1_df = pd.read_excel('FILENAME.xlsm', sheet_name=SHEET1NAME)
sheet2_df = pd.read_excel('FILENAME.xlsm', sheet_name=SHEET2NAME)
Run Code Online (Sandbox Code Playgroud)

选项 2

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

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

sheet1 = list(df.keys())[0]
Run Code Online (Sandbox Code Playgroud)

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

sheet1_df = pd.read_excel('FILENAME.xlsm', sheet_name=SHEET1NAME)
Run Code Online (Sandbox Code Playgroud)


小智 10

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

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)
Run Code Online (Sandbox Code Playgroud)

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


Ash*_*007 5

pd.read_excel('filename.xlsx') 
Run Code Online (Sandbox Code Playgroud)

默认情况下,请阅读工作簿的第一页。

pd.read_excel('filename.xlsx', sheet_name = 'sheetname') 
Run Code Online (Sandbox Code Playgroud)

阅读工作簿的特定表并

pd.read_excel('filename.xlsx', sheet_name = None) 
Run Code Online (Sandbox Code Playgroud)

从Excel到pandas数据框读取所有工作表,因为OrderedDict的类型表示嵌套数据框,所有工作表都作为在数据框内收集的数据框,其类型为OrderedDict。


Cre*_*eek 5

如果:

  • 您想要多个但不是全部工作表,并且
  • 你想要一个 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)
Run Code Online (Sandbox Code Playgroud)

或者

如果您所需的工作表具有通用的命名约定,并且还允许您与不需要的工作表区分开来,则可以实现一些自动化:

# 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
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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)
Run Code Online (Sandbox Code Playgroud)