2017-08-25 35 views
2

我有一個數百個Excel文件的文件夾,每個工作簿中都有九張紙,每個文件夾的組織方式都相同。我正在運行以下代碼來遍歷文件,併爲所有工作簿中的每個工作表創建一個數據框(因此dataframe「sheet_a_df」將從連接到單個數據框的每個工作簿中打印出「a」)。基於工作表名稱在多個Excel工作簿中爲for循環創建數據框?

sheet_a_df = pd.DataFrame() 
for file in glob.glob('C:\\Users\*.xlsx'): 
    df = pd.read_excel(file,sheetname='a') 
    sheet_1_df = sheet_1_df.append(df,ignore_index=True).dropna() 

sheet_b_df = pd.DataFrame() 
for file in glob.glob('C:\\Users\\*.xlsx'): 
    df = pd.read_excel(file,sheetname='b') 
    sheet_b_df = sheet_b_df.append(df,ignore_index=True).dropna() 

# And so on for all nine sheet names... 

但是,這需要複製和粘貼代碼九次(每張紙一次)。

有沒有更適當的方法來做到這一點?

回顧this question,我知道字典是在for循環中創建多個數據框的方法。我也想根據工作表的名稱爲每個df命名。我創建了一個我的工作表名稱列表,並嘗試了下面的代碼,但是得到一個KeyError,它只是返回第一個工作表的名稱。

sheet_names = ['a', 
       'b', 
       'c', 
       ...,] 

df_dict = {} 

for file in glob.glob('C:\\Users\*.xlsx'): 
    for sheet in sheet_names: 
     df = pd.read_excel(file,sheetname=sheet) 
     df_dict[sheet] = df_dict[sheet].append(df) 

有沒有辦法解決上述代碼來創建所有九個dfs,同時根據它們來自的工作表進行命名?

回答

0

你可以採取的事實,即如果你通過工作表名稱的listpd.read_excel功能的sheetname參數,它將返回dataframes其中的字典鍵是工作表名稱,值是與這些工作表名稱對應的數據框。因此,以下內容應該爲您提供一個串聯數據框字典:所有「a」數據框連在一起,所有「b」數據框連在一起,等等。

sheet_names = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'] 
data = {} 
for fn in glob.glob('C:\\Users\*.xlsx'): 
    dfs = pd.read_excel(fn, sheetname=sheet_names) 
    for k in dfs: 
     data.setdefault(k, pd.DataFrame()) 
     data[k] = pd.concat([data[k], dfs[k]]) 

現在data應dataframes與含從sheet_names元件鍵的字典。它的值是來自文件的相應表單名稱的連接數據框。

我希望這會有所幫助。

+0

謝謝;這就是我一直在尋找的。 – dmitriys

0

您正試圖將數據幀附加到不存在的字典項目。你應該先檢查項是否存在:

for file in glob.glob('C:\\Users\*.xlsx'): 
    for sheet in sheet_names: 
     df = pd.read_excel(file,sheetname=sheet) 
     if sheet in df_dict: 
      df_dict[sheet] = df_dict[sheet].append(df) 
     else: 
      df_dict[sheet] = df 
+0

通過'df_list'你是指一個字典鍵列表?我用'list(dict.fromkeys(sheet_names))'創建了'df_list'',但是得到一個_'NoneType'對象沒有屬性'append'_錯誤。 – dmitriys

+0

@dmitriys對不起,它是'df_dict',回答編輯。 –

+0

明白了;現在起作用。 – dmitriys

相關問題