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?
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:
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é.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