提问人:HaPsantran 提问时间:10/23/2014 最后编辑:smciHaPsantran 更新时间:10/12/2023 访问量:891616
使用 Pandas 对同一工作簿的多个工作表进行pd.read_excel()
Using Pandas to pd.read_excel() for multiple worksheets of the same workbook
问:
我有一个大型电子表格文件(.xlsx),我正在使用 python pandas 进行处理。碰巧我需要来自该大文件中的两个选项卡(工作表)的数据。其中一个选项卡有大量数据,另一个只是几个方形单元格。
当我在任何工作表上使用 pd.read_excel()
时,在我看来,整个文件都已加载(而不仅仅是我感兴趣的工作表)。因此,当我使用该方法两次(每张工作表一次)时,我实际上不得不忍受整个工作簿被读取两次(即使我们只使用指定的工作表)。
如何仅加载特定的工作表?pd.read_excel()
答:
试试 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_name
pd.read_excel()
None
sheet_name=0
如果指定,则将作为字典返回所有工作表。None
{sheet_name:dataframe}
评论
pd.ExcelFile
xls = pd.ExcelFile('path_to_file.xls' engine='openpyxl')
您还可以使用工作表的索引:
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耳机指出版本问题。
sheetname : string, int, strings/ints 的混合列表,或 None,默认 0 自 0.21.0 版起已弃用:请改用 sheet_name 源链接
评论
df_sheet_map = pd.read_excel(file_fullpath, sheetname=None)
df_sheet_map['house']
是的,不幸的是,它将始终加载完整文件。如果您反复执行此操作,最好将工作表提取到单独的 CSV 中,然后单独加载。您可以使用 d6tstack 自动执行该过程,它还添加了其他功能,例如检查所有工作表或多个 Excel 文件中的所有列是否相等。
import d6tstack
c = d6tstack.convert_xls.XLStoCSVMultiSheet('multisheet.xlsx')
c.convert_all() # ['multisheet-Sheet1.csv','multisheet-Sheet2.csv']
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。
如果您已将 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
评论
df1, df2 = pd.read_excel(filepath, sheet_name=["sheet1", "sheet2"]).values()
根据用例,有多种选项:
如果一个人不知道工作表名称。
如果工作表名称不相关。
如果知道床单的名称。
下面我们将仔细研究每个选项。
有关查找工作表名称等信息,请参阅“注释”部分。
选项 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 的文件夹中,一种方法是使用 create 变量,如下所示
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')
这将从文件中读取工作表SheetName
FileName.xlsx
您可以使用以下行阅读所有工作表
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)
评论
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]))
使用 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]
评论