使用熊猫分别合并Excel工作表

时间:2018-06-29 15:47:00

标签: python excel pandas

我正在用熊猫编写一个函数,该函数可以从工作目录中读取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或任何其他编程语言中有更好的替代方法。

1 个答案:

答案 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