очистка нескольких документов и сохранение их в одну книгу с помощью цикла в Pandas

У меня есть список почти из 30 файлов xlsx одного формата. У меня есть рабочий код очистки данных, и я хочу очистить их все и сохранить на отдельных листах в одной книге. Я подумал, что цикл лучше всего подходит для этой работы, но чего-то не хватает. Я видел некоторые функции, которые сохраняют несколько листов в рабочую книгу, но я надеюсь на read_excel, очистку фрейма данных, сохранение на лист и удаление фрейма данных. Происходит то, что он возвращает только последний лист в списке в новом документе Excel.

BOX = [
"aa1",
"aa2",
"aa3"]

for B in BOX:

    filename = B+".xls"

    #create data frame
    BDF = pd.read_excel(r'C:\Projects\BOXES\\' + filename)
    #clean data frame
    BDF = BDF.dropna(how="all")
    BDF['Total Cost'] = BDF['Total Cost'].str.replace('.', '')
    BDF.columns = ['LVL', 'PN', 'Leadtime', 'Description', 'Ext QTY']
    BDF.PN = BDF.PN.str.strip()

    sheetname=B
    #save to sheet
    with pd.ExcelWriter(r'C:\Projects\BOXES\BOXED.xlsx') as writer:
        BDF.to_excel(writer, sheet_name=B, index=False)
    #delete data frame before repeating 
    del(BDF)
    del(B)

person cmims    schedule 30.01.2017    source источник


Ответы (1)


Вы должны поместить with вне цикла, так как он автоматически открывает и закрывает файл в каждом цикле for. Следующее должно работать:

BOX = [
"aa1",
"aa2",
"aa3"]

with pd.ExcelWriter(r'C:\Projects\BOXES\BOXED.xlsx') as writer:

    for B in BOX:

        filename = B+".xls"

        #create data frame
        BDF = pd.read_excel(r'C:\Projects\BOXES\\' + filename)
        #clean data frame
        BDF = BDF.dropna(how="all")
        BDF['Total Cost'] = BDF['Total Cost'].str.replace('.', '')
        BDF.columns = ['LVL', 'PN', 'Leadtime', 'Description', 'Ext QTY']
        BDF.PN = BDF.PN.str.strip()

        sheetname=B
        #save to sheet
        BDF.to_excel(writer, sheet_name=B, index=False)
        #delete data frame before repeating 
        del(BDF)
        del(B)
person Fabio Lamanna    schedule 30.01.2017
comment
Спасибо, это получилось! - person cmims; 30.01.2017
comment
пожалуйста. Не забудьте проголосовать за ответ, если он работает для вас! - person Fabio Lamanna; 30.01.2017
comment
Еще один вопрос: имея внутри цикла «с», что он делал? Я все еще не уверен, что понимаю, что происходило до исправления. - person cmims; 30.01.2017
comment
Вы просто открывали и закрывали файл в каждом цикле, поэтому в конце вы получили только последний лист файла excel в результате последнего цикла for. - person Fabio Lamanna; 31.01.2017