通过多个循环合并Excel工作表

时间:2018-06-19 23:22:25

标签: python pandas

我想合并一些Excel工作簿,每个工作簿都包含多个工作表。

我已经建立了两组循环(一组,一组用于)以读取给定工作簿中每个工作表的行,然后对所有工作簿执行相同的操作。

我尝试在其中一个子集上执行此操作,直到我尝试使用pd.concat函数将这两个集合组合在一起之前,它似乎一直有效。给出的错误是

  

TypeError:第一个参数必须是pandas对象的可迭代对象,您   传递了一个类型为“ DataFrame”的对象

知道我做错了什么吗?

import pandas as pd    

d = 2013
numberOfSheets = 5

while d < 2015:
    #print(str(d) + ' beginning')
    f ='H:/MyDocuments/Z Project Work/scriptTest ' + str(d) + '.xlsx'  
    for i in range(1,numberOfSheets+1):
        data = pd.read_excel(f, sheetname = 'Table '+str(i), header=None) 
        print(i)
        df.append(data)   

    print(str(d) + ' complete')
    print(df)
    d += 1

df = pd.concat(df)
print(df)

final = "H:/MyDocuments/Z Project Work/mergedfile.xlsx" 
df.to_excel(final)

3 个答案:

答案 0 :(得分:2)

如错误所示,pd.concat()需要一个可迭代的列表,例如:pd.concat([df1, df2])将沿默认轴0串联df1df2,这意味着{{ 1}}附加到df2的底部。

两个问题需要解决:

  1. df1循环在为for分配任何内容之前先对其进行引用。
  2. df循环的每次迭代都会覆盖变量df

一种解决方法是在循环之前创建一个空的DataFrame列表,然后将DataFrame附加到该列表中,最后将该列表中的所有DataFrame串联起来。像这样:

for

答案 1 :(得分:2)

由于我无法发表评论,因此我将其作为答案:您可以通过打开文件一次,然后解析工作簿以获取每张图纸来加快代码的速度。每次迭代应节省一两秒钟,因为打开Excel文件的时间最长。这是一些可能有用的代码。

注意:设置sheet_name=None将返回工作簿中的所有工作表:

dfs = {<sheetname1>: <DataFrame1>, <sheetname2>: <DataFrame2>, etc.}  

代码如下:

xl = pd.ExcelFile(fpath)
dfs = xl.parse(sheetname=None, header=None)

for i, df in enumerate(dfs):
    <do stuff with each, if you want>
    print('Sheet {0} looks like:\n{1}'.format(i+1, df))

答案 2 :(得分:1)

谢谢你们。我接受了解决特定问题的答案,但是能够使用第二个答案以及此后的一些附加谷歌搜索(例如,glob)来修改原始代码,并使工作完全独立于工作簿或工作表而更加自动化。

上面的最终版本如下:

import pandas as pd
import glob
#import numpy as np
#import os, collections, csv
#from os.path import basename    

fpath = "H:/MyDocuments/Z Project Work/"

dfs = []
files = glob.glob(fpath+'*.xlsx') 

for f in files:
    xl = pd.ExcelFile(f) 
    xls = xl.parse(sheetname=None, header=0)
    for i, df in enumerate(xls):
        print(i)    
        dfs.append(xls[df])   

    print(f+ ' complete')

df_final = pd.concat(dfs, ignore_index=True)

final = "H:/MyDocuments/Z Project Work/mergedfile.xlsx" 
df_final.to_excel(final)