使用 Pandas 对同一工作簿的多个(但不是全部)工作表进行 pd.read_excel() 操作,无需重新加载整个文件
- 2024-12-16 08:35:00
- admin 原创
- 162
问题描述:
我有一个大型电子表格文件 (.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
如果不知道床单名称
# 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]))