如何连接同一个文件中的多个excel表?
Posted
技术标签:
【中文标题】如何连接同一个文件中的多个excel表?【英文标题】:how to concatenate multiple excel sheets from the same file? 【发布时间】:2018-03-18 06:29:09 【问题描述】:我有一个很大的 Excel 文件,其中包含许多不同的工作表。所有工作表都具有相同的结构,例如:
Name
col1 col2 col3 col4
1 1 2 4
4 3 2 1
如何将Pandas
中的所有这些工作表(垂直)连接起来,而不必手动命名每个工作表?如果这些是文件,我可以使用glob
来获取目录中的文件列表。但是在这里,对于 excel 表,我迷路了。
有没有办法在生成的数据框中创建一个变量来标识数据来自的工作表名称?
谢谢!
【问题讨论】:
【参考方案1】:试试这个:
dfs = pd.read_excel(filename, sheet_name=None, skiprows=1)
这将为您返回一个 DF 字典,您可以使用 pd.concat(dfs)
或 @jezrael 已经在他的回答中发布的那样轻松连接:
df = pd.concat(pd.read_excel(filename, sheet_name=None, skiprows=1))
sheet_name:无 -> 所有工作表作为 DataFrame 的字典
更新:
有没有办法在结果数据框中创建一个变量 标识数据来自的工作表名称?
dfs = pd.read_excel(filename, sheet_name=None, skiprows=1)
假设我们有以下字典:
In [76]: dfs
Out[76]:
'd1': col1 col2 col3 col4
0 1 1 2 4
1 4 3 2 1, 'd2': col1 col2 col3 col4
0 3 3 4 6
1 6 5 4 3
现在我们可以添加一个新列:
In [77]: pd.concat([df.assign(name=n) for n,df in dfs.items()])
Out[77]:
col1 col2 col3 col4 name
0 1 1 2 4 d1
1 4 3 2 1 d1
0 3 3 4 6 d2
1 6 5 4 3 d2
【讨论】:
然后pd.concat(dfs.values())
产生结果。
很好,但我怎样才能摆脱 Name
超级专栏?我想我可以在字典的某个地方使用一些 read_excel (skip = 1)?
@blacksite,是的,谢谢。我以为 OP 已经知道了... ;-)
@ℕʘʘḆḽḘ,使用skiprows=1
@ℕʘʘḆḽḘ,我已经更新了我的答案 - 这就是你想要的吗?【参考方案2】:
首先添加参数sheetname=None
为DataFrames
的dict
和skiprows=1
省略第一行,然后使用concat
为MultiIndex DataFrame
。
最后使用reset_index
表示第一级的列:
df = pd.concat(pd.read_excel('multiple_sheets.xlsx', sheetname=None, skiprows=1))
df = df.reset_index(level=1, drop=True).rename_axis('filenames').reset_index()
【讨论】:
感谢耶兹瑞尔。同样的问题,我怎样才能摆脱这里每张纸的第一行?skiprows=1
应该有帮助。
太棒了。谢谢大家,但我不得不把这个给最快的一个! :)【参考方案3】:
从this question记笔记:
import pandas as pd
file = pd.ExcelFile('file.xlsx')
names = file.sheet_names # see all sheet names
df = pd.concat([file.parse(name) for name in names])
结果:
df
Out[6]:
A B
0 1 3
1 2 4
0 5 6
1 7 8
然后你可以运行df.reset_index()
,来重置索引。
编辑:pandas.ExcelFile.parse
是,根据熊猫文档:
等效于 read_excel(ExcelFile, ...) 有关接受参数的更多信息,请参阅 read_excel 文档字符串
【讨论】:
谢谢,但为什么使用file.parse
而不是read.excel?
请见上文。
太棒了。谢谢大家,但我不得不把这个给最快的一个! :)【参考方案4】:
file_save_location='myfolder'
file_name='filename'
location = ''myfolder1'
os.chdir(location)
files_xls = glob.glob("*.xls*")
excel_names=[f for f in files_xls]
sheets = pd.ExcelFile(files_xls[0]).sheet_names
def combine_excel_to_dfs(excel_names, sheet_name):
sheet_frames = [pd.read_excel(x, sheet_name=sheet_name) for x in excel_names]
combined_df = pd.concat(sheet_frames).reset_index(drop=True)
return combined_df
i = 0
while i < len(sheets):
process = sheets[i]
consolidated_file= combine_excel_to_dfs(excel_names, process)
consolidated_file.to_csv(file_save_location+file_name+'.csv')
i = i+1
else:
"we done on consolidation part"
【讨论】:
如果您可以编辑帖子并添加一些描述和代码会更好。以上是关于如何连接同一个文件中的多个excel表?的主要内容,如果未能解决你的问题,请参考以下文章
如何将单个工作表中的多行(在 excel 中)转换为多个 CSV 文件
如何将1个excel文件中的100个工作表拆分成独立的excel文件