web-dev-qa-db-fra.com

Python Faites une boucle dans des feuilles Excel, placez-les dans un df

J'ai un fichier Excel foo.xlsx avec environ 40 feuilles sh1, sh2, etc. Chaque feuille a le format:

area      cnt   name\nparty1   name\nparty2
blah      9         5               5
Word      3         7               5

Dans chaque feuille, je veux renommer les vars au format name\nparty pour n'avoir que party comme étiquette. Exemple de sortie:

area      cnt    party1    party2     sheet
bacon     9         5         5        sh1
spam      3         7         5        sh1
eggs      2         18        4        sh2

Je lis dans le dossier avec:

book = pd.ExcelFile(path) 

Et puis je me demande si je dois faire:

for f in filelist:
    df = pd.ExcelFile.parse(book,sheetname=??)
    'more operations here'
    # only change column names 2 and 3
     i, col in enumerate(df):
     if i>=2 and i<=3:
        new_col_name = col.split("\n")[-1]
        df[new_col_name] =

Ou quelque chose comme ça?

8
Yolo_chicken

MISE À JOUR au 09/09/2019:

utilisation sheet_name pour v0.25.1 au lieu de sheetname


Le read_Excel la méthode de pandas vous permet de lire toutes les feuilles à la fois si vous définissez le paramètre de mot clé sheetname=None. Cela renvoie un dictionnaire - les clés sont les noms des feuilles et les valeurs sont les feuilles sous forme de trames de données.

En utilisant cela, nous pouvons simplement parcourir le dictionnaire et:

  1. Ajouter une colonne supplémentaire aux cadres de données contenant le nom de feuille approprié
  2. Utilisez la méthode rename pour renommer nos colonnes - en utilisant un lambda, nous prenons simplement l'entrée finale de la liste obtenue en divisant chaque nom de colonne chaque fois qu'il y a une nouvelle ligne. S'il n'y a pas de nouvelle ligne, le nom de la colonne est inchangé.
  3. Ajouter à la "table complète"

Une fois cela fait, nous réinitialisons l'index et tout devrait bien se passer. Remarque: si vous avez des parties présentes sur une feuille mais pas sur d'autres, cela fonctionnera toujours mais remplira toutes les colonnes manquantes pour chaque feuille avec NaN.

import pandas as pd

sheets_dict = pd.read_Excel('Book1.xlsx', sheetname=None)

full_table = pd.DataFrame()
for name, sheet in sheets_dict.items():
    sheet['sheet'] = name
    sheet = sheet.rename(columns=lambda x: x.split('\n')[-1])
    full_table = full_table.append(sheet)

full_table.reset_index(inplace=True, drop=True)

print full_table

Tirages:

    area  cnt  party1  party2   sheet
0  bacon    9       5       5  Sheet1
1   spam    3       7       5  Sheet1
2   eggs    2      18       4  Sheet2
14
asongtoruin