我有一个较大的电子表格文件(.xlsx),正在使用python pandas处理。碰巧我需要该大文件中两个选项卡中的数据。选项卡中的一个包含大量数据,另一个仅包含几个正方形单元格。
当我在任何工作表上使用pd.read_excel()时,在我看来整个文件都已加载(而不仅仅是我感兴趣的工作表)。因此,当我两次使用该方法(每张纸一次)时,我实际上不得不使整个工作簿被读两次(即使我们仅使用指定的工作表)。
我使用的是错误的还是仅限于这种方式?
谢谢!
我有一个较大的电子表格文件(.xlsx),正在使用python pandas处理。碰巧我需要该大文件中两个选项卡中的数据。选项卡中的一个包含大量数据,另一个仅包含几个正方形单元格。
当我在任何工作表上使用pd.read_excel()时,在我看来整个文件都已加载(而不仅仅是我感兴趣的工作表)。因此,当我两次使用该方法(每张纸一次)时,我实际上不得不使整个工作簿被读两次(即使我们仅使用指定的工作表)。
我使用的是错误的还是仅限于这种方式?
谢谢!
Answers:
尝试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}
字典返回。
sheet_name
并且不使用,它仍然有效sheetname
。我没有意识到那是不推荐使用的部分,因为它仍在read_excel方法上起作用,但在parse方法上却没有作用。
有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代替源链接
df_sheet_map = pd.read_excel(file_fullpath, sheetname=None)
,这将自动在字典中保存图纸。并以如下所示的数据帧形式访问图纸:df_sheet_map['house']
您还可以为工作表使用索引:
xls = pd.ExcelFile('path_to_file.xls')
sheet1 = xls.parse(0)
将给出第一个工作表。对于第二个工作表:
sheet2 = xls.parse(1)
是的,不幸的是,它将始终加载整个文件。如果您重复执行此操作,则最好将工作表提取为单独的CSV,然后分别加载。您可以使用d6tstack自动化该过程,它还添加了其他功能,例如检查所有工作表或多个Excel文件中的所有列是否相等。
import d6tstack
c = d6tstack.convert_xls.XLStoCSVMultiSheet('multisheet.xlsx')
c.convert_all() # ['multisheet-Sheet1.csv','multisheet-Sheet2.csv']
如果您已将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()