Opt*_*esh 14 python excel pandas
我正潜入大熊猫并进行实验.至于从Excel文件中读取数据.我想知道使用ExcelFile和read_excel有什么区别.两者似乎都有效(尽管语法略有不同,正如预期的那样),文档同时支持这两种语法.在这两种情况下,文档都描述了相同的方法:"将Excel表读入DataFrame"和"将Excel表读入pandas DataFrame".(read_excel和excel_file的文档)
我在这里看到的答案是,使用其中任何一个,没有解决差异.此外,谷歌搜索没有产生讨论此问题的结果.
WRT我的测试,这看起来相当:
path = "test/dummydata.xlsx"
xl = pd.ExcelFile(path)
df = xl.parse("dummydata") # sheet name
Run Code Online (Sandbox Code Playgroud)
和
path = "test/dummydata.xlsx"
df = pd.io.excel.read_excel(path, sheetname=0)
Run Code Online (Sandbox Code Playgroud)
除了后者为我节省一条线的事实,两者之间是否存在差异,是否有理由使用其中任何一个?
谢谢!
Joh*_*n Y 24
除语法之外没有特别的区别.从技术上讲,ExcelFile是一个类,read_excel是一个功能.在任何一种情况下,实际的解析都是由其中_parse_excel定义的方法处理的ExcelFile.
在早期版本的pandas中,read_excel完全由单个语句组成(注释除外):
return ExcelFile(path_or_buf,kind=kind).parse(sheetname=sheetname,
kind=kind, **kwds)
Run Code Online (Sandbox Code Playgroud)
并ExcelFile.parse没有做多打电话ExcelFile._parse_excel.
在最近的pandas版本中,read_excel确保它有一个ExcelFile对象(如果没有则创建一个),然后_parse_excel直接调用该方法:
if not isinstance(io, ExcelFile):
io = ExcelFile(io, engine=engine)
return io._parse_excel(...)
Run Code Online (Sandbox Code Playgroud)
并且使用更新的(和统一的)参数处理,ExcelFile.parse实际上只是单个语句:
return self._parse_excel(...)
Run Code Online (Sandbox Code Playgroud)
这就是现在的文档ExcelFile.parse说的原因
相当于read_excel(ExcelFile,...)有关已接受参数的详细信息,请参阅read_excel docstring
至于声称在循环中速度更快的另一个答案ExcelFile.parse,这实际上只取决于您是否ExcelFile每次都从头开始创建对象.你当然可以创建你ExcelFile一次,外循环,并通过该给read_excel你的循环内:
xl = pd.ExcelFile(path)
for name in xl.sheet_names:
df = pd.read_excel(xl, name)
Run Code Online (Sandbox Code Playgroud)
这相当于
xl = pd.ExcelFile(path)
for name in xl.sheet_names:
df = xl.parse(name)
Run Code Online (Sandbox Code Playgroud)
如果您的循环涉及不同的路径(换句话说,您正在阅读许多不同的工作簿,而不只是单个工作簿中的多个工作表),那么ExcelFile无论如何您都无法为每个路径创建一个全新的实例,然后再次,无论是ExcelFile.parse和read_excel将相当于(且同样慢).
小智 11
ExcelFile.parse 是比较快的.
假设您正在循环中读取数据帧.随着ExcelFile.parse你只是传递Excelfile对象(xl你的情况).所以excel表只加载一次,你用它来获取你的数据帧.如果是Read_Excel,则传递路径而不是Excelfile对象.所以基本上每次再次加载工作簿.如果您的工作簿有大量的工作表和数万行,那么会弄得一团糟.