使用Pandas循环清理多个文档并将它们保存到一个工作簿中。

3

我有一个近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)
1个回答

2

由于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)

谢谢,这样做就可以了! - cmims
1
如果这个答案对你有用,请不要忘记点赞! - Fabio Lamanna
还有一个问题,循环中有'with'是做什么的?在修复之前我仍然不确定发生了什么。 - cmims
1
你刚刚在每个循环中打开、写入和关闭文件,这就是为什么最终你只得到了 Excel 文件的最后一个工作表,因为它是最后一个 for 循环的结果。 - Fabio Lamanna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接