J'ai un grand fichier tableur (.xlsx) que je traite à l'aide de python pandas. Il se trouve que j'ai besoin des données de deux onglets dans ce fichier volumineux. L'un des onglets contient une tonne de données et l'autre, quelques cellules carrées.
Quand j'utilise pd.read_Excel () sur toute feuille de calcul , il me semble que tout le fichier est chargé (pas seulement la fiche de travail qui m'intéresse). Ainsi, lorsque j'utilise la méthode deux fois (une fois pour chaque feuille), je dois effectivement subir la totalité du cahier de travail lu deux fois (même si nous n'utilisons que la feuille spécifiée).
Est-ce que je l'utilise mal ou est-ce simplement limité de cette façon?
Je vous remercie!
Essayez pd.ExcelFile
:
_xls = pd.ExcelFile('path_to_file.xls')
df1 = pd.read_Excel(xls, 'Sheet1')
df2 = pd.read_Excel(xls, 'Sheet2')
_
Comme l'a noté @HaPsantran, l'intégralité du fichier Excel est lue pendant l'appel ExcelFile()
(il ne semble pas y avoir de moyen de le contourner). Cela vous évite simplement de devoir lire le même fichier chaque fois que vous souhaitez accéder à une nouvelle feuille.
Notez que l'argument _sheet_name
_ de pd.read_Excel()
peut être le nom de la feuille (comme ci-dessus), un entier spécifiant le numéro de la feuille (par exemple 0, 1, etc.), une liste de noms de feuilles ou d'index, ou None
. Si une liste est fournie, elle renvoie un dictionnaire dans lequel les clés sont les noms/index des feuilles et les valeurs sont les trames de données. La valeur par défaut consiste simplement à renvoyer la première feuille (c'est-à-dire _sheet_name=0
_).
Si None
est spécifié, toutes les feuilles sont renvoyées sous la forme d'un dictionnaire _{sheet_name:dataframe}
_.
Il y a 3 options:
Exemple de code:
import pandas as pd
df = pd.read_Excel('Excel_file_path.xls')
# this will read the first sheet into df
xls = pd.ExcelFile('Excel_file_path.xls')
# Now you can list all sheets in the file
xls.sheet_names
# ['house', 'house_extra', ...]
# to read just one sheet to dataframe:
df = pd.read_Excel(file_name, sheetname="house")
# to read all sheets to a map
sheet_to_df_map = {}
for sheet_name in xls.sheet_names:
sheet_to_df_map[sheet_name] = xls.parse(sheet_name)
Mise à jour:
# @ihightower pointed out in the comments that all sheets can be
# directly read into an ordered dictionary in 1 step
# for pandas version >= 0.21.0
sheet_to_df_map = pd.read_Excel(file_name, sheet_name=None)
# for pandas version < 0.21.0
sheet_to_df_map = pd.read_Excel(file_name, sheetname=None)
Mise à jour 2: Merci @toto_tico pour l'avoir signalé.
sheetname: string, int, liste mixte de chaînes/ints, ou None, valeur par défaut 0 Obsolète depuis la version 0.21.0: utilisez plutôt sheet_name à la place de lien source
Vous pouvez également utiliser l'index pour la feuille:
xls = pd.ExcelFile('path_to_file.xls')
sheet1 = xls.parse(0)
donnera la première feuille de calcul. pour la deuxième feuille de calcul:
sheet2 = xls.parse(1)
Vous pouvez également spécifier le nom de la feuille en tant que paramètre:
data_file = pd.read_Excel('path_to_file.xls', sheetname="sheet_name")
chargera uniquement la feuille "nom_fichier"
pd.read_Excel('filename.xlsx')
par défaut, lisez la première feuille du classeur.
pd.read_Excel('filename.xlsx', sheet_name = 'sheetname')
lire la fiche spécifique du classeur et
pd.read_Excel('filename.xlsx', sheet_name = None)
lire toutes les feuilles de calcul d'Excel à pandas dataframe en tant que type de OrderedDict: imbriquées, toutes les feuilles de calcul sous forme d'images collectées dans dataframe et son type étant OrderedDict.
Oui, malheureusement, le fichier complet sera toujours chargé. Si vous faites cela à plusieurs reprises, il est probablement préférable d'extraire les feuilles pour séparer les CSV, puis de les charger séparément. Vous pouvez automatiser ce processus avec d6tstack , qui ajoute également des fonctionnalités supplémentaires, telles que la vérification de l'égalité de toutes les colonnes sur toutes les feuilles ou de plusieurs fichiers Excel.
import d6tstack
c = d6tstack.convert_xls.XLStoCSVMultiSheet('multisheet.xlsx')
c.convert_all() # ['multisheet-Sheet1.csv','multisheet-Sheet2.csv']