我想合并一些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)
答案 0 :(得分:2)
如错误所示,pd.concat()
需要一个可迭代的列表,例如:pd.concat([df1, df2])
将沿默认轴0串联df1
和df2
,这意味着{{ 1}}附加到df2
的底部。
两个问题需要解决:
df1
循环在为for
分配任何内容之前先对其进行引用。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)