2017-08-25 60 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

相关问题