2017-05-31 127 views
0

我有40左右excel文档,我想将第一个工作表读入一个Dataframe,然后将合并后的工作表导出到一个csv文件。下面的代码到目前为止工作,但我也需要添加一个具有导入的图纸名称的列。每个工作簿的工作表名称都不相同。我基本上想用实际的表名替换下面的'WorsksheetName'。导出数据框作为列的工作表名称

import pandas as pd 
import numpy as np 
import glob 
import openpyxl 
glob.glob("..\*.xlsx") 
all_data = pd.DataFrame() 
for f in glob.glob("M:\Completed\*.xlsx"): 
     df = pd.read_excel(f,sheetname=1) 
     df['Sheet'] = 'WorksheetName' 
     all_data = all_data.append(df,ignore_index=True) 
all_data.to_csv('Workoad.csv') 

回答

1

如果您使用设置sheetname=None,熊猫导入工作簿的所有工作表到字典中,其中关键是工作表名称和值是工作本身的数据帧。用这种方法,你可以做到以下几点:

import pandas as pd 
import numpy as np 
import glob 
import openpyxl 

all_data = pd.DataFrame() 
for f in glob.glob("M:\Completed\*.xlsx"): 
    sheets_dict = pd.read_excel(f, sheetname=None) 
    for name, frame in sheets_dict.items(): 
     frame['Sheet'] = name 
     all_data = all_data.append(frame, ignore_index=True) 

all_data.to_csv('Workload.csv') 

您目前的设定似乎只能保持工作簿的第二片 - 您可以通过使用某种过滤器对name做到这一点。

+0

每个工作簿的第一个和第二个工作表具有不同的列标题,但它们在所有工作簿中都是一致的(即工作表1在每个工作簿上具有相同的标题,对于工作表2也是如此)。我将如何修改此代码,以便将所有工作表1导出为一个csv,并将所有工作表2导出为单独的csv? – Dread

+0

@Dread在工作簿之间是否有任何一致的命名? – asongtoruin

+0

第一张表格总是有一个部门缩写,后面跟着“Teaching Load”(例如“AN GIO教学负载”),第二张表具有相同的缩写,后跟“Workload”(例如“AN GIO Workload”)。每个部门都有一个工作簿与这两张表,但与他们的部门缩写。由于每个部门工作表的缩写更改,我使用了sheet0和sheet1。两张表的结构不同(不同的列和数据从不同的行开始)。 – Dread

0

您可以使用pd.ExcelFile检索工作表名称,如下所示。

import pandas as pd 
import glob 
all_data = [] 
for f in glob.glob("M:\Completed\*.xlsx"): 
     xl = pd.ExcelFile(f) 
     sheet = xl.sheet_names[0] 
     df = xl.parse(sheet) 
     df['Sheet'] = sheet 
     all_data.append(df) 
pd.concat(all_data).to_csv('Workoad.csv') 

的变化使用的pd.concat代替df.append应该加快速度了一些 - 这样你只需要建立一个新的数据帧一次,而不是四十次,每进行一次添加。我也改变了选择的索引。如果您确实需要第二张纸,请随时将其更改为sheet = xl.sheet_names[1]; python及其软件包通常从零开始计数,即使使用从1开始计数的程序(如excel)。

相关问题