ExcelFile与 pandas中的read_excel

Opt*_*esh 14 python excel pandas

我正潜入大熊猫并进行实验.至于从Excel文件中读取数据.我想知道使用ExcelFile和read_excel有什么区别.两者似乎都有效(尽管语法略有不同,正如预期的那样),文档同时支持这两种语法.在这两种情况下,文档都描述了相同的方法:"将Excel表读入DataFrame"和"将Excel表读入pandas DataFrame".(read_excelexcel_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.parseread_excel将相当于(且同样慢).


小智 11

ExcelFile.parse 是比较快的.

假设您正在循环中读取数据帧.随着ExcelFile.parse你只是传递Excelfile对象(xl你的情况).所以excel表只加载一次,你用它来获取你的数据帧.如果是Read_Excel,则传递路径而不是Excelfile对象.所以基本上每次再次加载工作簿.如果您的工作簿有大量的工作表和数万行,那么会弄得一团糟.

  • 您不必将路径传递给 `read_excel`。您还可以传递一个“ExcelFile”对象,在这种情况下,它们实际上是等效的。 (2认同)

Bob*_*ner 5

我相信 Pandas 第一次实现 excel 使用了两步过程,但后来添加了名为 read_excel 的一步过程。可能把第一个留在了,因为人们已经在使用它了