使用 Pandas 对同一工作簿的多个(但不是全部)工作表进行 pd.read_excel() 操作,无需重新加载整个文件

2024-12-16 08:35:00
admin
原创
162
摘要:问题描述:我有一个大型电子表格文件 (.xlsx),正在使用 python pandas 进行处理。碰巧我需要该大型文件中两个选项卡(工作表)的数据。其中一个选项卡包含大量数据,而另一个选项卡只有几个方形单元格。当我在任何pd.read_excel()工作表上使用时,在我看来,整个文件都已加载(而不仅仅是我感...

问题描述:

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

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

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


解决方案 1:

尝试pd.ExcelFile

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

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

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

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

解决方案 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文件,获取sheet列表,然后选择并加载sheet。

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:字符串,整数,字符串/整数的混合列表,或 None,默认值为 0。自 0.21.0 版起已弃用:改用 sheet_name源链接

解决方案 3:

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

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

将仅上传工作表"sheet_name"

解决方案 4:

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

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

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

sheet2 = xls.parse(1)

解决方案 5:

根据使用情况有多种选项:

  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

这里我们考虑知道工作表名称的情况。为了举例说明,假设有三张工作表Sheet1,分别名为Sheet2、 和Sheet3。每张工作表中的内容相同,如下所示

     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工作原理如下(来源):

在此处输入图片描述

  • 将每张表存储在不同的数据框中(比如说,,,df1... df2

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)
  • 这可能是一篇相关的读物。

解决方案 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 作为输出

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

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

解决方案 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:

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

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

解决方案 11:

使用以下方法从 Excel 文件中读取单张表read_excel

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

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

# 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=[0, 1, 2])          
# 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]  

解决方案 12:

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

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

查看d6tstack Excel 示例

解决方案 13:

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

解决方案 14:

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]))
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用