如何连接同一个文件中的多个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=NoneDataFramesdictskiprows=1 省略第一行,然后使用concatMultiIndex 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 文件

用C语言写CSV文件,如何写出多个工作表?

如何在连接多个必须是 PIVOT 的表时创建临时表

如何将1个excel文件中的100个工作表拆分成独立的excel文件

如何从访问数据库中的左连接中选择excel表 - EXCEL VBA

如何将EXCEL中的多个表格复制到另一个表格中