web-dev-qa-db-fra.com

Lire la feuille Excel avec plusieurs en-têtes en utilisant Pandas

J'ai une feuille Excel avec plusieurs en-têtes comme:

_________________________________________________________________________
____|_____|        Header1    |        Header2     |        Header3      |
ColX|ColY |ColA|ColB|ColC|ColD||ColD|ColE|ColF|ColG||ColH|ColI|ColJ|ColDK|
1   | ds  | 5  | 6  |9   |10  | .......................................
2   | dh  |  ..........................................................
3   | ge  |  ..........................................................
4   | ew  |  ..........................................................
5   | er  |  ..........................................................

Maintenant, vous pouvez voir ici que les deux premières colonnes n'ont pas d'en-têtes, elles sont vides, mais d'autres colonnes ont des en-têtes comme Header1, Header2 et Header3. Je veux donc lire cette feuille et la fusionner avec une autre feuille avec une structure similaire.

Je veux le fusionner sur la première colonne 'ColX'. En ce moment, je fais ceci:

import pandas as pd

totalMergedSheet = pd.DataFrame([1,2,3,4,5], columns=['ColX'])
file = pd.ExcelFile('ExcelFile.xlsx')
for i in range (1, len(file.sheet_names)):
    df1 = file.parse(file.sheet_names[i-1])
    df2 = file.parse(file.sheet_names[i])
    newMergedSheet = pd.merge(df1, df2, on='ColX')
    totalMergedSheet = pd.merge(totalMergedSheet, newMergedSheet, on='ColX')

Mais je ne connais pas correctement ses colonnes de lecture et je pense que je ne retournerai pas les résultats comme je le souhaite. Donc, je veux que le cadre résultant soit comme:

________________________________________________________________________________________________________
____|_____|        Header1    |        Header2     |        Header3      |        Header4     |        Header5      |
ColX|ColY |ColA|ColB|ColC|ColD||ColD|ColE|ColF|ColG||ColH|ColI|ColJ|ColK| ColL|ColM|ColN|ColO||ColP|ColQ|ColR|ColS|
1   | ds  | 5  | 6  |9   |10  | ..................................................................................
2   | dh  |  ...................................................................................
3   | ge  |  ....................................................................................
4   | ew  |  ...................................................................................
5   | er  |  ......................................................................................

Toutes suggestions s'il vous plaît. Merci.

9
muazfaiz

Pandas a déjà une fonction qui lira pour vous une feuille de calcul Excel entière, vous n'avez donc pas besoin d'analyser/fusionner manuellement chaque feuille. Jetez un oeil pandas.read_Excel () . Il vous permet non seulement de lire un fichier Excel sur une seule ligne, mais il fournit également des options pour aider à résoudre le problème que vous rencontrez.

Puisque vous avez des sous-colonnes, ce que vous recherchez est MultiIndexing . Par défaut, pandas lira dans la ligne supérieure comme seule ligne d'en-tête. Vous pouvez passer un argument header dans pandas.read_Excel() qui indique le nombre de lignes à utiliser comme en-têtes. Dans votre cas particulier, vous souhaitez que header=[0, 1], indiquant les deux premières lignes. Vous pouvez également avoir plusieurs feuilles, vous pouvez donc passer sheetname=None également (cela lui indique de parcourir toutes les feuilles). La commande serait:

df_dict = pandas.read_Excel('ExcelFile.xlsx', header=[0, 1], sheetname=None)

Cela renvoie un dictionnaire où les clés sont les noms de feuille et les valeurs sont les DataFrames pour chaque feuille. Si vous souhaitez tout réduire en un seul DataFrame, vous pouvez simplement utiliser pandas.concat:

df = pandas.concat(df_dict.values(), axis=0)
17
beeftendon