Je plonge dans pandas et j'expérimente autour. Quant à la lecture des données d'un fichier Excel. Je me demande quelle est la différence entre l'utilisation d'ExcelFile pour read_Excel. Les deux semblent fonctionner (bien que la syntaxe soit légèrement différente, comme peut être attendue) et la documentation prend en charge les deux. Dans les deux cas, la documentation décrit la méthode de la même manière: "Lire un tableau Excel dans DataFrame" et "Lire un tableau Excel dans un pandas DataFrame ". ( documentation pour read_Excel , et pour Excel_file )
Je vois des réponses ici sur SO qui utilise non plus, sans aborder la différence. En outre, une recherche Google n'a pas produit de résultat qui traite de ce problème.
WRT mes tests, ceux-ci semblent équivalents:
path = "test/dummydata.xlsx"
xl = pd.ExcelFile(path)
df = xl.parse("dummydata") # sheet name
et
path = "test/dummydata.xlsx"
df = pd.io.Excel.read_Excel(path, sheetname=0)
outre le fait que ce dernier me sauve une ligne, y a-t-il une différence entre les deux, et y a-t-il une raison d'utiliser l'une ou l'autre?
Merci!
Il n'y a pas de différence particulière au-delà de la syntaxe. Techniquement, ExcelFile
est une classe et read_Excel
est une fonction. Dans les deux cas, l'analyse réelle est gérée par le _parse_Excel
méthode définie dans ExcelFile
.
Dans les versions antérieures de pandas, read_Excel
consistait entièrement en une seule déclaration (autre que des commentaires):
return ExcelFile(path_or_buf,kind=kind).parse(sheetname=sheetname,
kind=kind, **kwds)
Et ExcelFile.parse
n'a pas fait beaucoup plus que d'appeler ExcelFile._parse_Excel
.
Dans les versions récentes des pandas, read_Excel
s'assure qu'il possède un objet ExcelFile
(et en crée un s'il ne l'est pas), puis appelle le _parse_Excel
méthode directement:
if not isinstance(io, ExcelFile):
io = ExcelFile(io, engine=engine)
return io._parse_Excel(...)
et avec la gestion des paramètres mise à jour (et unifiée), ExcelFile.parse
n'est vraiment qu'une seule instruction:
return self._parse_Excel(...)
C'est pourquoi les documents pour ExcelFile.parse
maintenant dire
Equivalent à read_Excel (ExcelFile, ...) Voir la docstring read_Excel pour plus d'informations sur les paramètres acceptés
Quant à ne autre réponse qui prétend que ExcelFile.parse
est plus rapide dans une boucle, cela revient vraiment à savoir si vous créez à chaque fois l'objet ExcelFile
à partir de zéro. Vous pouvez certainement créer votre ExcelFile
une fois, en dehors de la boucle, et passer que à read_Excel
dans votre boucle:
xl = pd.ExcelFile(path)
for name in xl.sheet_names:
df = pd.read_Excel(xl, name)
Ce serait équivalent à
xl = pd.ExcelFile(path)
for name in xl.sheet_names:
df = xl.parse(name)
Si votre boucle implique des chemins différents (en d'autres termes, vous lisez de nombreux classeurs différents, pas seulement plusieurs feuilles dans un seul classeur), vous pouvez alors ' t contourner la nécessité de créer une toute nouvelle instance de ExcelFile
pour chaque chemin d'accès, puis à nouveau, les deux ExcelFile.parse
et read_Excel
sera équivalent (et également lent).
ExcelFile.parse
est plus rapide.
Supposons que vous lisez des trames de données en boucle. Avec ExcelFile.parse
vous venez de passer l'objet Excelfile
(xl
dans votre cas). Ainsi, la feuille Excel n'est chargée qu'une seule fois et vous l'utilisez pour obtenir vos cadres de données. Dans le cas de Read_Excel, vous passez le chemin au lieu de l'objet Excelfile
. Donc, essentiellement à chaque fois que le classeur est à nouveau chargé. Fait un gâchis si votre classeur contient des charges de feuilles et des dizaines de milliers de lignes.
Je crois que Pandas la première implémentation d'Excel a utilisé le processus en deux étapes, mais a ensuite ajouté le processus en une étape appelé read_Excel. Probablement laissé le premier parce que les gens l'utilisaient déjà