【问题标题】:ExcelFile Vs. read_excel in pandasExcelFile 与。熊猫中的read_excel
【发布时间】:2014-12-15 23:15:42
【问题描述】:

我正在研究熊猫并进行试验。至于从 Excel 文件中读取数据。我想知道使用 ExcelFile 和 read_excel 有什么区别。两者似乎都有效(尽管语法略有不同,正如预期的那样),并且文档支持两者。在这两种情况下,文档都描述了相同的方法:“将 Excel 表读入 DataFrame”和“将 Excel 表读入 pandas DataFrame”。 (documentation for read_excelfor excel_file

我在 SO 上看到了使用其中任何一种的答案,但没有解决差异。此外,Google 搜索并未产生讨论此问题的结果。

WRT 我的测试,这些看起来是等效的:

path = "test/dummydata.xlsx"
xl = pd.ExcelFile(path)
df = xl.parse("dummydata")  # sheet name

path = "test/dummydata.xlsx" 
df = pd.io.excel.read_excel(path, sheetname=0)

除了后者为我节省了一行之外,两者之间是否有区别,是否有理由使用其中一个?

谢谢!

【问题讨论】:

  • 也不会真正为您节省一行,因为:df = pd.ExcelFile(path).parse("dummydata")
  • 好问题。这是我认为对有抱负的程序员产生积极影响的问题。

标签: python excel pandas


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    ExcelFile.parse 更快。

    假设您正在循环读取数据帧。 使用ExcelFile.parse,您只需传递Excelfile 对象(在您的情况下为xl)。所以excel表只加载一次,你用它来获取你的数据框。 在 Read_Excel 的情况下,您传递路径而不是 Excelfile 对象。所以基本上每次再次加载工作簿时。如果您的工作簿有大量工作表和数万行,则会造成混乱。

    【讨论】:

    • 您不必将路径传递给read_excel。你也可以传递一个ExcelFile 对象,在这种情况下它们实际上是等价的。
    【解决方案3】:

    除了语法之外没有特别的区别。从技术上讲,ExcelFile 是一个类,read_excel 是一个函数。在任何一种情况下,实际的解析都由ExcelFile 中定义的_parse_excel 方法处理。

    在早期版本的 pandas 中,read_excel 完全由一条语句组成(cmets 除外):

    return ExcelFile(path_or_buf,kind=kind).parse(sheetname=sheetname,
                                                  kind=kind, **kwds)
    

    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(...)
    

    通过更新(和统一)的参数处理,ExcelFile.parse 真的只是一条语句:

    return self._parse_excel(...)
    

    这就是为什么ExcelFile.parse 的文档现在说

    等效于 read_excel(ExcelFile, ...) 有关接受参数的更多信息,请参阅 read_excel 文档字符串

    至于another answer 声称ExcelFile.parse 在循环中更快,这实际上归结为您是否每次都从头开始创建ExcelFile 对象。您当然可以在循环外创建一次 ExcelFile,然后将 that 传递给循环内的 read_excel

    xl = pd.ExcelFile(path)
    for name in xl.sheet_names:
        df = pd.read_excel(xl, name)
    

    这相当于

    xl = pd.ExcelFile(path)
    for name in xl.sheet_names:
        df = xl.parse(name)
    

    如果您的循环涉及不同的路径(换句话说,您正在阅读许多不同的工作簿,而不仅仅是单个工作簿中的多个工作表),那么您就无法避免创建品牌- 无论如何,每个路径的新 ExcelFile 实例,然后再一次,ExcelFile.parseread_excel 将是等效的(并且同样慢)。

    【讨论】:

    • 错字:ExcelFile.sheetnames 应该是ExcelFile.sheet_names
    • @grisaitis - 谢谢,已修复!
    • 要使用ExcelFile 打开工作簿,然后解析特定的工作表,该解决方案受益于engine 参数的使用,因为xlrd 2.0 resp。 pandas 1.2.0(2020 年 12 月)。示例:xls = pd.ExcelFile(path,engine='xlrd')df = xls.parse(sheet_name=sheetname);或xlsx = pd.ExcelFile(path,engine='openpyxl')df = xlsx.parse(sheet_name=sheetname)
    猜你喜欢
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    相关资源
    最近更新 更多