我正在用熊猫编写一个函数,该函数可以从工作目录中读取excel文件。每个excel文件都由多张工作表组成,但是每个文件中的相应工作表具有相同的列名,并且每个文件中的工作表数也相同。
我想具有一个功能,该功能可以合并/追加来自不同文件的每个工作表,从而将所有文件中的sheet1合并到一个数据帧中,所有文件中的sheet2合并为第二个数据帧,依此类推。最后,我想知道创建的数据帧的数量。
为此,我编写了以下代码:
fpath = "/path to files/"
from os import walk
df = pd.DataFrame()
f = []
xls = []
dff = []
mypath = fpath
for (dirpath, dirnames, filenames) in walk(mypath):
f.extend(filenames)
break
for i in range(0, len(f)):
f[i] = mypath+"/"+f[i]
xls.append(pd.ExcelFile(f[i]))
cout = 0
for fil in range(0, len(xls)):
for sh in range(0, len(xls)):
if(cout <= len(xls)):
df = df.append(pd.read_excel(xls[sh], fil))
dff.append(df)
cout = cout + 1
我引入了cout变量来控制在所有文件中的每个合并/追加工作表1之后,循环应该中断,否则所有工作表都将合并到单个数据帧中。
问题:问题是该函数仅返回合并了第一张工作表的一个数据框后停止。如果删除“ cout”开关,则所有工作表都将合并。谁能帮助我修复功能代码,以便它1)合并/附加每个文件中的相应工作表,2)从(1)中创建数据框,然后返回该数据框?这样,我将为每个合并/追加的工作表都有一个数据框。
有人可以帮忙吗?
注意:我正在熊猫中做这件事,但是建议您是否认为R或任何其他编程语言中有更好的替代方法。
答案 0 :(得分:2)
好吧,我仔细阅读了您的代码,可能会给您一个答案,而无需太多循环。也许有帮助,也许没有。
当您指向一个文件夹时,让我们改用listdir
。使用一次pd.ExcelFile
获取工作表名称,然后遍历所有工作表名称,并为每个特定的工作表名称pd.concat
浏览不同的excel文件。
import pandas as pd
import os
# Preparation
p = 'exceltest' #<-- folder name
files = [os.path.join(p,i) for i in os.listdir(p) if i.endswith('.xlsx')]
sheets = pd.ExcelFile(files[0]).sheet_names
# Dictionary holding the sheet_names as keys
dfs = {s: pd.concat(pd.read_excel(f, sheet_name=s) for f in files) for s in sheets}
# Only for demo purpose
print(dfs[sheets[0]])
在我的示例文件(名为Workbook1,Workbook2)中,具有sheet_names(表1,Sheet 2)和(Matrix A,B行突破1,2)的文件如下:
A B
0 1 2
0 1 2