web-dev-qa-db-fra.com

Utilisation de Pandas avec pd.read_Excel () pour plusieurs feuilles de calcul du même classeur

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!

107
HaPsantran

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}_.

146
Noah

Il y a 3 options:

  1. Lire la première feuille directement dans le cadre de données
  2. Lisez le fichier Excel et obtenez une liste de feuilles. Puis choisissez et chargez les draps.
  3. Lisez toutes les feuilles et stockez-les dans un dictionnaire.

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

66
Vikash Singh

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)
26
Elliott

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"

22
Mat0kan
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.

3
Ashu007

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']

Voir exemples d6tstack Excel

1
citynorman