使用 Pandas 读取具有多个标题的 excel 表

Posted

技术标签:

【中文标题】使用 Pandas 读取具有多个标题的 excel 表【英文标题】:Read excel sheet with multiple header using Pandas 【发布时间】:2017-03-26 01:05:48 【问题描述】:

我有一个带有多个标题的 excel 表,例如:

_________________________________________________________________________
____|_____|        Header1    |        Header2     |        Header3      |
ColX|ColY |ColA|ColB|ColC|ColD||ColD|ColE|ColF|ColG||ColH|ColI|ColJ|ColDK|
1   | ds  | 5  | 6  |9   |10  | .......................................
2   | dh  |  ..........................................................
3   | ge  |  ..........................................................
4   | ew  |  ..........................................................
5   | er  |  ..........................................................

现在您可以看到前两列没有标题,它们是空白的,但其他列有标题,如 Header1、Header2 和 Header3。所以我想阅读这张表并将其与其他具有相似结构的表合并。

我想将它合并到第一列“ColX”。现在我正在这样做:

import pandas as pd

totalMergedSheet = pd.DataFrame([1,2,3,4,5], columns=['ColX'])
file = pd.ExcelFile('ExcelFile.xlsx')
for i in range (1, len(file.sheet_names)):
    df1 = file.parse(file.sheet_names[i-1])
    df2 = file.parse(file.sheet_names[i])
    newMergedSheet = pd.merge(df1, df2, on='ColX')
    totalMergedSheet = pd.merge(totalMergedSheet, newMergedSheet, on='ColX')

但我不知道它既不能正确阅读列,我认为也不会以我想要的方式返回结果。所以,我希望得到的框架应该是这样的:

________________________________________________________________________________________________________
____|_____|        Header1    |        Header2     |        Header3      |        Header4     |        Header5      |
ColX|ColY |ColA|ColB|ColC|ColD||ColD|ColE|ColF|ColG||ColH|ColI|ColJ|ColK| ColL|ColM|ColN|ColO||ColP|ColQ|ColR|ColS|
1   | ds  | 5  | 6  |9   |10  | ..................................................................................
2   | dh  |  ...................................................................................
3   | ge  |  ....................................................................................
4   | ew  |  ...................................................................................
5   | er  |  ......................................................................................

请有任何建议。谢谢。

【问题讨论】:

【参考方案1】:

[查看 cmets 了解更新和更正]

Pandas 已经有一个功能,可以为您读取整个 Excel 电子表格,因此您无需手动解析/合并每个工作表。看看pandas.read_excel()。它不仅可以让您在一行中读取 Excel 文件,还可以提供帮助解决您遇到的问题的选项。

由于您有子列,因此您要查找的是MultiIndexing。默认情况下,pandas 将在第一行读取为唯一的标题行。您可以将header 参数传递给pandas.read_excel(),以指示要用作标题的行数。在您的特定情况下,您需要header=[0, 1],表示前两行。您可能还有多张工作表,因此您也可以传递sheetname=None(这告诉它遍历所有工作表)。命令是:

df_dict = pandas.read_excel('ExcelFile.xlsx', header=[0, 1], sheetname=None)

这将返回一个字典,其中键是工作表名称,值是每个工作表的 DataFrame。如果你想把它全部折叠到一个 DataFrame 中,你可以简单地使用 pandas.concat:

df = pandas.concat(df_dict.values(), axis=0)

【讨论】:

你用的是哪个版本? @Nguaial 我不记得了,但鉴于这篇文章的日期,我假设在 0.21.0 之前,之后 sheetname 已被弃用。然而,在这种特殊情况下,sheetname 似乎可以简单地替换为 sheet_name 以保持相同的功能。 只是为了修正你的答案,实际上,这一行返回一个数据框:df = pandas.read_excel('ExcelFile.xlsx', header=[0, 1], sheet_name=None) 并全部折叠,只是df.columns=df.columns.to_flat_index() @AfonsoMedina 你是对的,如果sheet_name 不是None,你只会得到dict。我的错。

以上是关于使用 Pandas 读取具有多个标题的 excel 表的主要内容,如果未能解决你的问题,请参考以下文章

根据文件名将目录中的多个 .xlsx 文件读取到单独的 Pandas 数据框中

使用 RODBC 读取具有多个标题的 Excel 文件

pandas读取和写入excel多个sheet表单

pandas读取多个excel文件并拼接(append)起来形成最终的dataframe与标签文件连接(join)形成最终学习数据集

pandas读取excel文件出错啥原因?

Pandas库read_excel()参数详解