2017-06-14 49 views
1

我有一個Excel文件foo.xlsx用約40張sh1sh2等。每個片具有格式:Python的環路通過Excel工作表,放入一個DF

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

在每個片材我要重命名的格式爲name\nparty的變量只能將party作爲標籤。示例輸出:

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

我讀在文件中:

book = pd.ExcelFile(path) 

然後想知道如果我需要做的:

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

或類似的東西?

回答

2

如果您設置關鍵字參數sheetname=None,則read_excel方法pandas可讓您一次讀取所有表單。這將返回一個字典 - 鍵是表名,值是作爲數據框的表。

利用這一點,我們可以通過字典簡單循環和:

  1. 添加一個額外的列包含相關SHEETNAME
  2. 使用rename方法重命名我們列dataframes - 通過使用lambda,我們只需在每次有新行時拆分每個列名獲取列表的最終條目。如果沒有新行,列名稱不變。
  3. 追加到「全表」

一旦做到這一點,我們將重置指數和所有應該很好。注意:如果您在一張紙上顯示的是當事人而不是其他人,則此功能仍然有效,但會填寫每張表中缺失的任何列,其中包含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 

打印:

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

對不起,我不清楚。 'name \ nparty'中的名字改變了每張表格。這是選舉結果,我不希望候選人只說出他們的派對。是否有某種通配符或字符串拆分,只保留'\ n'之後的所有內容? –

+2

我認爲.split('\ n')[ - 1]只保留\ n後面的部分字符串。例如, 「Frank Underwood \ n虛構民主黨人」.split('\ n')[ - 1] 返回'Fictional Democrat' – DalekSec

+1

@DalekSec正在編輯它!肯定的正確方法。 – asongtoruin

相關問題