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