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


165

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

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

我使用的是错误的还是仅限于这种方式?

谢谢!


Answers:


243

尝试pd.ExcelFile

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

正如@HaPsantran指出的那样,在ExcelFile()调用过程中将读取整个Excel文件(似乎没有办法解决此问题)。这仅使您不必每次访问新表时都必须读取相同的文件。

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

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


4
FWIW,看起来(上次测试时)第一行已加载到所有内容中,因此无法有效地仅加载一张纸,但至少要获得多张纸并不需要对整张纸进行多次加载。
HaPsantran

1
熊猫不赞成使用此答案,现在在v0.21.0中对我崩溃了。它应该替换为@ Mat0kan给出的那个。
DStauffman

1
@DStauffman这对我来说仍然可以正常工作,并且我从代码或文档中都看不到任何不推荐使用的指示。如果您遇到问题,我会在github上为pandas或xlrd(pandas使用的python excel解析库)提交问题
Noah

@Noah,谢谢,我对此进行了更多研究,您是对的,只要我使用sheet_name并且不使用,它仍然有效sheetname。我没有意识到那是不推荐使用的部分,因为它仍在read_excel方法上起作用,但在parse方法上却没有作用。
DStauffman

@Noah确实是一个不错的答案。有没有办法在您阅读的Excel工作表中找到活动单元格?
Eswar

97

有3个选项:

将所有表直接阅读到有序词典中。

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)

感谢@ihightower指出它,并@toto_tico指出版本问题。

将第一张表直接读入数据框

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, 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)

更新:感谢@toto_tico指出版本问题。

sheetname:字符串,整数,字符串/整数的混合列表,或无,默认值0,自0.21.0版开始不推荐使用:使用sheet_name代替源链接


12
在我拥有的最新熊猫(0.20.3)中,要将所有图纸读取到地图上..所有需要的是df_sheet_map = pd.read_excel(file_fullpath, sheetname=None),这将自动在字典中保存图纸。并以如下所示的数据帧形式访问图纸:df_sheet_map['house']
ihightower

32

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

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

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

sheet2 = xls.parse(1)

7
如果您需要工作表名称的列表,请输入xls.sheet_names
Stefano Fedele,

28

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

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

将仅上传工作表"sheet_name"


9
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。


1

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

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

请参阅d6tstack Excel示例


0

如果您已将excel文件与python程序(相对地址)保存在同一文件夹中,则只需提及工作表编号以及文件名。语法= pd.read_excel(Filename,SheetNo)示例:

    data=pd.read_excel("wt_vs_ht.xlsx","Sheet2")
    print(data)
    x=data.Height
    y=data.Weight
    plt.plot(x,y,'x')
    plt.show()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.