2017-06-14 2 views
1

Ich habe eine Excel-foo.xlsx mit ca. 40 Blatt Datei sh1, sh2 usw. Jedes Blatt hat das Format:Python Schleife durch Excel-Sheets, legen Sie in eine df

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

In jedem Blatt Ich möchte die umbenennen vars mit dem Format name\nparty, nur die party als ein Label zu haben. Beispiel Ausgabe:

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

ich mit in der Datei lese:

book = pd.ExcelFile(path) 

Und dann fragen, ob ich tun muss:

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

Oder so ähnlich?

Antwort

2

Mit der read_excel-Methode von pandas können Sie alle Blätter gleichzeitig lesen, wenn Sie den Schlüsselwortparameter sheetname=None festlegen. Dies gibt ein Wörterbuch zurück - die Schlüssel sind die Blattnamen und die Werte sind die Blätter als Datenrahmen.

dies, können wir einfach Schleife durch das Wörterbuch und:

  1. hinzufügen eine zusätzliche Spalte mit den Datenrahmen der entsprechenden Blattname enthält
  2. die rename Methode können Sie unsere Spalten umbenennen - durch einen lambda verwenden, Wir nehmen einfach den letzten Eintrag der Liste, die durch Aufspalten jedes Spaltennamens erhalten wird, immer wenn eine neue Zeile vorhanden ist. Wenn keine neue Zeile vorhanden ist, ist der Spaltenname unverändert.
  3. Anfügen an die „full table“

Sobald dies geschehen ist, setzen wir den Index und alle sollten gut sein. Hinweis: Wenn Sie Parteien auf einem Blatt haben, aber nicht auf anderen, funktioniert dies immer noch, füllt aber alle fehlenden Spalten für jedes Blatt mit 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 

Drucke:

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

Es tut mir leid ich war unklar. Der Name in 'name \ nparty' ändert jedes Blatt. Es sind Wahlergebnisse und ich will nicht, dass die Kandidaten nur ihre Partei nennen. Gibt es eine Art Wildcard oder String Split um nur alles nach dem '\ n' zu behalten? –

+2

Ich denke .split ('\ n') [- 1] behält nur Teile eines Strings nach dem \ n. Zum Beispiel: "Frank Underwood \ nFiktional Democrat" .split ('\ n') [- 1] gibt 'Fictional Democrat' zurück – DalekSec

+1

@DalekSec hat diesen Beitrag gerade bearbeitet! Der richtige Ansatz ist sicher. – asongtoruin

Verwandte Themen