【问题标题】:Pandas read excel sheet with multiple header when first column is empty当第一列为空时,熊猫读取具有多个标题的 Excel 表
【发布时间】:2018-11-01 12:25:57
【问题描述】:

我有一个这样的 excel 表:

我想用 pandas read_excel 来阅读它,我试过这个:

df = pd.read_excel("test.xlsx", header=[0,1])

但它抛出了这个错误:

ParserError: Passed header=[0,1] are too many rows for this multi_index of columns

有什么建议吗?

【问题讨论】:

  • 您是否为Header 1Header 2 使用合并单元格?如果是,请尝试不使用它们。
  • 当我意识到这个问题与大黑熊和白熊无关时,我不得不说这是一个令人失望的标题。

标签: python excel pandas


【解决方案1】:

如果您不介意在阅读完 Excel 后对 DataFrame 进行按摩,您可以尝试以下两种方法:

>>> pd.read_excel("/tmp/sample.xlsx", usecols = "B:F", skiprows=[0])
  header1 Unnamed: 1 Unnamed: 2 header2 Unnamed: 4
0    col1       col2       col3    col4       col5
1       a          0          x       3          d
2       b          1          y       4          e
3       c          2          z       5          f

在上面,你必须修复 MultiIndex 的第一级,因为 header1 和 header2 是合并的单元格

>>> pd.read_excel("/tmp/sample.xlsx", header=[0,1], usecols = "B:F", 
skiprows=[0])
        header1      header2
header1    col1 col2    col3 col4
a             0    x       3    d
b             1    y       4    e
c             2    z       5    f

在上面,它通过跳过空行并仅用数据解析列 (B:F) 非常接近。如果您注意到,列已经移动了...

注意不是一个干净的解决方案,只是想在帖子而不是评论中与您分享示例

-- 根据与 OP 的讨论进行编辑--

Based on documentation for pandas read_excel, header[1,2] 正在为您的列创建 MultiIndex。看起来它根据 A 列中填充的内容来确定 DataFrame 的标签。因为那里什么都没有......索引有一堆 Nan 就像这样

>>> pd.read_excel("/tmp/sample.xlsx", header=[1,2])
    header1           header2
       col1 col2 col3    col4 col5
NaN       a    0    x       3    d
NaN       b    1    y       4    e
NaN       c    2    z       5    f

再次,如果您可以清理列并且 xlsx 的第一列始终为空白...您可以将其删除,如下所示。希望这就是您正在寻找的。​​p>

>>> pd.read_excel("/tmp/sample.xlsx", header[1,2]).reset_index().drop(['index'], level=0, axis=1)
  header1           header2
     col1 col2 col3    col4 col5
0       a    0    x       3    d
1       b    1    y       4    e
2       c    2    z       5    f

【讨论】:

  • 感谢您的建议。正如您所说,它非常接近,但我需要将列名放在正确的位置。我发现尝试按预期工作:df = pd.read_excel("/tmp/sample.xlsx", header=[1,2]).reset_index(drop=True)。我不知道为什么它与该标头参数一起使用。
  • 我认为这应该可以完成工作pd.read_excel("/tmp/sample.xlsx", header[1,2]).reset_index().drop(['index'], level=0, axis=1)
  • 我还根据我对read_excelheader 参数的文档的解释和理解修改了原始帖子。希望其他人能加入我们的理解。
【解决方案2】:

Here 是关于header 参数的文档:

用于已解析 DataFrame 的列标签的行(0-indexed)。如果传递了一个整数列表,这些行位置将被组合成一个 MultiIndex。如果没有标题,请使用 None。

我认为以下应该可行:

df = pd.read_excel("test.xlsx", skiprows=2, usecols='B:F', header=0)

【讨论】:

  • @OP 如果您同意删除 Header 1 和 Header 2,这是一个很好的解决方案。
  • 感谢您的建议。但我需要 Header 1 和 Header 2。如果我不知道到底有多少列怎么办?它可以改变,所以我不能使用 usecols ='B:F'
  • @AlexandraEspichán 你能找到解决方案吗?我正在寻找类似的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
  • 2015-05-30
相关资源
最近更新 更多