簡體   English   中英

根據工作表名稱從多個Excel工作簿的for循環中創建數據框?

[英]Create dataframes in for loop from multiple Excel workbooks based on worksheet name?

我有一個包含數百個Excel文件的文件夾,這些文件的組織方式完全相同,每個工作簿中有九張紙。 我正在運行以下代碼來遍歷文件,並為所有工作簿中的每個工作表創建一個數據框(因此,將每個工作簿中的數據表“ sheet_a_df”串聯在一起成為一個數據框)。

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...

但是,這需要將代碼復制並粘貼9次(每張紙一次)。

有沒有更合適的方法可以做到這一點?

回顧這個問題 ,我理解詞典是在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)

有沒有一種方法可以修復以上代碼,以創建所有九個df,同時根據它們來自的工作表命名它們?

您正在嘗試將數據框追加到不存在的字典項中。 您應該首先檢查密鑰是否存在:

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

您可以利用以下事實:如果將工作表名稱list傳遞給pd.read_excel函數的sheetname參數,它將返回一個數據幀字典,其中鍵是工作表名稱,值是與那些對應的數據幀工作表名稱。 結果,以下內容將為您提供串聯數據幀的字典:所有“ 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應該是數據幀的字典,其中的鍵包含sheet_names中的元素。 它的值是文件中相應工作表名稱的串聯數據框。

我希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM