我潜入大熊猫并进行实验。至于从Excel文件中读取数据。我想知道使用ExcelFile和read_excel之间的区别。两者似乎都有效(尽管语法略有不同,正如预期的那样),文档同时支持这两种语法。在这两种情况下,文档都描述了相同的方法:"将Excel表读入DataFrame"和#34;将Excel表读入pandas DataFrame"。 (documentation for read_excel和for excel_file)
我在这里看到了使用其中任何一个的解答,没有解决差异。此外,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)
除了后者为我节省了一条线之外,两者之间是否存在差异,是否有理由使用其中任何一条?
谢谢!
答案 0 :(得分:14)
除语法之外没有特别的区别。从技术上讲,<!DOCTYPE html>
<meta http-equiv="Content-Type" content="text/html" ; charset="UTF-8">
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>1-1</title>
<link href="../../css/Book.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="../../js/Book.js"></script>
</head>
<body id="x1" xml:lang="en-US">
<div class="buttons"> <button class="button" onclick="myFunction3()">bigger</button> <button class="button" onclick="myFunction4()">big</button> <button class="button" onclick="myFunction5()">normal</button> <button class="button" onclick="myFunction6()">small</button>
<button
class="button" onclick="myFunction7()">smaller</button> <button class="button" onclick="myFunction8()">fontWieght</button> </div>
<div class="Basic-Text-Frame">
<p class="SubEnglish">lorem <b>this is bold</b> ipsum lorem ipsum <b> this is also bold </b>ipsum lorem ipsumlorem ipsum lorem ipsum lorem ipsum lorem ipsum.</p>
<h4 class="SmallEnglish"><b class="char-style-override-4">d.</b> lorem ipsum lorem ipsum lorem ipsum lorem ipsm lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum.</h4>
<p class="SubEnglish"><span class="Normal char-style-override-4">lorem ipsum lorem ipsum lorem ipsum lorem im lorem psum lorem ipsum lorem ipsum lorem ipsum.</span></p>
<h1 id="toc_marker-1" class="Latin"><span class="char-style-override-3">I. </span>lorem ipsum<span class="char-style-override-3"></span></h1>
<h2 id="toc_marker-1-1" class="English">A. lorem ipsum lorem ipsum lorem ipsum (active pharmaceutical ingredient<span> </span>(API))</h2>
<h3 class="Num"><b class="char-style-override-4">1.</b> lorem ipsum<b class="char-style-override-4"> This is bold</b> lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsumlorem ipsum lorem ipsumlorem ipsum.</h3>
<h2 id="toc_marker-1-3" class="English">C. lorem ipsum lorem ipsum lorem ipsumlorem ipsum lorem ipsum</h2>
</div>
</body>
</html>
是一个类,ExcelFile
是一个函数。在任何一种情况下,实际解析都由read_excel
中定义的_parse_excel
方法处理。
在早期版本的pandas中,read_excel
完全由一个语句组成(注释除外):
ExcelFile
而ExcelFile.parse
除了致电return ExcelFile(path_or_buf,kind=kind).parse(sheetname=sheetname,
kind=kind, **kwds)
外,并没有做更多的事情。
在最新版本的pandas中,read_excel
确保它有一个ExcelFile._parse_excel
对象(如果它没有,则创建一个),然后直接调用ExcelFile
方法:
_parse_excel
并且通过更新(和统一)参数处理,ExcelFile.parse
实际上只是单个语句:
if not isinstance(io, ExcelFile):
io = ExcelFile(io, engine=engine)
return io._parse_excel(...)
这就是return self._parse_excel(...)
的文档现在说
相当于read_excel(ExcelFile,...)有关接受的参数的更多信息,请参阅read_excel docstring
至于声称ExcelFile.parse
在循环中速度更快的another answer,这实际上只取决于您是否每次都从头开始创建ExcelFile.parse
对象。您当然可以在循环外创建ExcelFile
一次,然后将 传递给循环中的ExcelFile
:
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.parse
将是等效的(同样慢)。
答案 1 :(得分:10)
ExcelFile.parse
更快。
假设您正在循环中读取数据帧。
使用ExcelFile.parse
,您只需传递Excelfile
对象(xl
)。所以excel表只加载一次,你用它来获取你的数据帧。
如果是Read_Excel,则传递路径而不是Excelfile
对象。所以基本上每次再次加载工作簿。如果您的工作簿有大量的工作表和数万行,那么会弄得一团糟。
答案 2 :(得分:4)
我相信Pandas首次实现excel使用了两步流程,但随后添加了一步称为read_excel的流程。可能会留下第一个,因为人们已经在使用它了