python - 使用 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 或任何其他编程语言有更好的替代方案,请提出建议。
解决方案
好的,我查看了您的代码,我可能会为您提供答案,而无需循环太多。也许它有帮助,也许没有。
当您指向一个文件夹时,让我们使用它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