我有许多 Excel 工作簿,每个工作簿都有多个工作表,我想合并它们。
我已经设置了两组循环(一个 while,一个 for)来读取给定工作簿中每个工作表的行,然后对所有工作簿执行相同的操作。
我尝试在其中的一个子集上执行此操作,在我尝试使用 pd.concat 函数组合这两个集合之前,它似乎一直有效。给出的错误是
TypeError: first argument must be an iterable of pandas objects, you passed an object of type "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)
请您参考如下方法:
如错误所述,pd.concat() 需要一个可迭代对象,如列表:pd.concat([df1, df2]) 将连接 df1 和 df2 沿默认轴 0,这意味着 df2 附加到 df1 的底部。
有两个问题需要解决:
for循环在为它分配任何内容之前引用df。for循环的每次迭代都会覆盖变量df。
一种解决方法是在循环之前创建一个空的 DataFrame 列表,然后将 DataFrame 附加到该列表,最后连接该列表中的所有 DataFrame。像这样:
import pandas as pd
d = 2013
numberOfSheets = 5
dfs = []
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)
dfs.append(data)
print(str(d) + ' complete')
print(df)
d += 1
# ignore_index=True gives the result a default IntegerIndex
# starting from 0
df_final = pd.concat(dfs, ignore_index=True)
print(df_final)
final_path = "H:/MyDocuments/Z Project Work/mergedfile.xlsx"
df_final.to_excel(final_path)
