web-dev-qa-db-fra.com

ExcelFile Vs. read_Excel dans pandas

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!

14
Optimesh

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

20
John Y

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.

11
Pranav Kohli

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à

4
Bob Haffner