首页 > 解决方案 > 使用 pandas 单独组合 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)制作数据框,并返回数据框?这样我将为每个合并/附加的工作表都有一个数据框。

有人可以帮忙吗?

注意:我在 pandas 中执行此操作,但如果您认为 R 或任何其他编程语言有更好的替代方案,请提出建议。

标签: pythonexcelpandas

解决方案


好的,我查看了您的代码,我可能会为您提供答案,而无需循环太多。也许它有帮助,也许没有。

当您指向一个文件夹时,让我们使用它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]])

在我的带有 sheet_names (Sheet 1, Sheet 2) 和 (Matrix A,B rowbreak 1,2) 的示例文件(命名为 Workbook1,Workbook2)中打印:

   A  B
0  1  2
0  1  2

推荐阅读