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

168

J'ai un grand fichier de feuille de calcul (.xlsx) que je traite à l'aide de pandas python. Il se trouve que j'ai besoin de données de deux onglets dans ce gros fichier. L'un des onglets contient une tonne de données et l'autre ne contient que quelques cellules carrées.

Quand j'utilise pd.read_excel () sur n'importe quel feuille calcul, il me semble que tout le fichier est chargé (pas seulement la feuille de calcul qui m'intéresse). Ainsi, lorsque j'utilise la méthode deux fois (une fois pour chaque feuille), je dois effectivement souffrir que tout le classeur soit 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 manière?

Je vous remercie!

HaPsantran
la source

Réponses:

247

Essayez pd.ExcelFile:

xls = pd.ExcelFile('path_to_file.xls')
df1 = pd.read_excel(xls, 'Sheet1')
df2 = pd.read_excel(xls, 'Sheet2')

Comme indiqué par @HaPsantran, l'intégralité du fichier Excel est lu pendant l' ExcelFile()appel (il ne semble pas y avoir de moyen de contourner cela). Cela vous évite simplement d'avoir à lire le même fichier à chaque fois que vous souhaitez accéder à une nouvelle feuille.

Notez que l' sheet_nameargument to 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'indices, ou None. Si une liste est fournie, elle renvoie un dictionnaire dans lequel les clés sont les noms / index de feuille et les valeurs sont les blocs de données. La valeur par défaut est de simplement renvoyer la première feuille (c.-à-d.sheet_name=0 ).

Si Noneest spécifié, toutes les feuilles sont renvoyées, sous forme de {sheet_name:dataframe}dictionnaire.

Noé
la source
4
FWIW, il semble que (la dernière fois que je l'ai testé) la première ligne se charge de tout , il n'y a donc aucun moyen de tirer efficacement une seule feuille, mais au moins obtenir plusieurs feuilles ne nécessite pas plusieurs charges de la feuille entière.
HaPsantran
1
Cette réponse est obsolète par les pandas et plante maintenant pour moi dans la v0.21.0. Il doit être remplacé par celui donné par @ Mat0kan.
DStauffman
1
@DStauffman Cela fonctionne toujours bien pour moi et je ne vois aucune indication du code ou de la documentation indiquant que cela est obsolète. Si vous rencontrez des problèmes, je soumettrais un problème sur le github pour les pandas ou xlrd (la bibliothèque d'analyse python Excel utilisée par les pandas)
Noah
@Noah, merci d'avoir examiné cela un peu plus et vous avez raison, cela fonctionne toujours tant que je l'utilise sheet_nameet non sheetname. Je n'avais pas réalisé que c'était la partie obsolète, car elle fonctionnait toujours sur la méthode read_excel, mais pas sur la méthode parse.
DStauffman
@Noah En effet, une bonne réponse. Existe-t-il un moyen de trouver la cellule active dans la feuille Excel que vous lisez?
Eswar
97

Il existe 3 options:

Lisez toutes les feuilles directement dans un dictionnaire ordonné.

import pandas as pd

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

Merci @ihightower pour l'avoir signalé et @toto_tico pour avoir signalé le problème de version.

Lire la première feuille directement dans le dataframe

df = pd.read_excel('excel_file_path.xls')
# this will read the first sheet into df

Lisez le fichier Excel et obtenez une liste de feuilles. Ensuite, choisissez et chargez les feuilles.

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

Lisez toutes les feuilles et stockez-les dans un dictionnaire. Identique au premier mais plus explicite.

# 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: Merci @toto_tico d'avoir signalé le problème de version.

sheetname: string, int, liste mixte de chaînes / entiers, ou None, par défaut 0 Obsolète depuis la version 0.21.0: utilisez le nom de la feuille à la place Source Link

Vikash Singh
la source
12
dans les derniers pandas que j'ai (0.20.3), pour lire toutes les feuilles sur une carte .. tout ce qui est nécessaire est df_sheet_map = pd.read_excel(file_fullpath, sheetname=None), cela aura les feuilles dans un dictionnaire automatiquement .. et accéder à la feuille en tant que dataframe comme ceci:df_sheet_map['house']
ihightower
32

Vous pouvez également utiliser l'index de 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)
Elliott
la source
7
Si vous voulez une liste des noms de feuilles, tapez simplement xls.sheet_names
Stefano Fedele
28

Vous pouvez également spécifier le nom de la feuille en tant que paramètre:

data_file = pd.read_excel('path_to_file.xls', sheet_name="sheet_name")

téléchargera uniquement la feuille "sheet_name".

Mat0kan
la source
9
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 feuille 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 signifie des dataframes imbriquées, toutes les feuilles de calcul en tant que dataframes collectées à l'intérieur de dataframe et son type est OrderedDict.

Ashu007
la source
1

Oui, malheureusement, il chargera toujours le fichier complet. 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 vérifier si toutes les colonnes sont égales sur toutes les feuilles ou sur plusieurs fichiers Excel.

import d6tstack
c = d6tstack.convert_xls.XLStoCSVMultiSheet('multisheet.xlsx')
c.convert_all() # ['multisheet-Sheet1.csv','multisheet-Sheet2.csv']

Voir les exemples Excel de d6tstack

citynorman
la source
0

Si vous avez enregistré le fichier Excel dans le même dossier que votre programme python (Adressage relatif), il vous suffit de mentionner le numéro de feuille avec le nom du fichier. Syntaxe = pd.read_excel (Filename, SheetNo) Exemple:

    data=pd.read_excel("wt_vs_ht.xlsx","Sheet2")
    print(data)
    x=data.Height
    y=data.Weight
    plt.plot(x,y,'x')
    plt.show()
Nikita Agarwala
la source