【问题标题】:Fix DataFrame columns when reading an Excel file with a header with merged cells在读取带有合并单元格标题的 Excel 文件时修复 DataFrame 列
【发布时间】:2017-06-27 05:23:09
【问题描述】:

我想用 Python Pandas 读取一个如下所示的 Excel 文件:

https://www.dropbox.com/s/1usfr3fxfy2qlpp/header_with_merged_cells.xlsx?dl=0

我们可以看到这个 Excel 文件有一个合并单元格的标题

我做到了

import pandas as pd

df = pd.read_excel("header_with_merged_cells.xlsx", skiprows=3)

print(df)
print(df.dtypes)
print(df.columns)

它返回一个像这样的DataFrame:

        ColA ColB ColC  Unnamed: 3           Unnamed: 4 ColD
0        NaT  NaN    1         2.0                    3  NaN
1 2010-01-01    A    A         2.1  2010-02-01 00:00:00    E
2 2010-01-02    B    C         2.2  2010-02-02 00:00:00    F

dtypes点赞:

ColA          datetime64[ns]
ColB                  object
ColC                  object
Unnamed: 3           float64
Unnamed: 4            object
ColD                  object

columns点赞:

Index(['ColA', 'ColB', 'ColC', 'Unnamed: 3', 'Unnamed: 4', 'ColD'], dtype='object')

有没有办法修复列以获取 ColA, ColB, ColC.1, ColC.2, ColC.3, ColD 或 MultiIndex 列?

一个问题是 D5 单元格被视为float(而不是intstr) 另一个问题是 E 列应该被视为datetime64[ns]

header`read_excel 的参数可以帮忙:

df = pd.read_excel("header_with_merged_cells.xlsx", skiprows=3, header=[0,1])

但是我们得到一个像这样的DataFrame:

ColA                     ColB ColC                               ColD
           Unnamed: 0_level_1    1    2          3 Unnamed: 4_level_1
2010-01-01                  A    A  2.1 2010-02-01                  E
2010-01-02                  B    C  2.2 2010-02-02                  F

dtypes点赞:

ColA
ColB  Unnamed: 0_level_1            object
ColC  1                             object
      2                            float64
      3                     datetime64[ns]
ColD  Unnamed: 4_level_1            object
dtype: object

columns 喜欢:

MultiIndex(levels=[['ColB', 'ColC', 'ColD'], [1, 2, 3, 'Unnamed: 0_level_1', 'Unnamed: 4_level_1']],
           labels=[[0, 1, 1, 1, 2], [3, 0, 1, 2, 4]],
           names=['ColA', None])

看到Unnamed: 0_level_1Unnamed: 4_level_1 之类的列很奇怪。 没有办法解决吗?

【问题讨论】:

  • 快速解决方案是df = pd.read_excel("header_with_merged_cells.xlsx", skiprows=3, header=[0,1])
  • 谢谢 我不知道标题可能是行索引列表。但仍有一些清理工作要做。 ColA ColB ColC ColD Unnamed: 0_level_1 1 2 3 Unnamed: 4_level_1 2010-01-01 A A 2.1 2010-02-01 E 2010-01-02 B C 2.2 2010-02-02 F

标签: python excel pandas


【解决方案1】:

这并不容易。

首先添加参数header 用于创建MultiIndex,然后将Unnamed 列名重命名为空字符串。

df = pd.read_excel("header_with_merged_cells.xlsx", skiprows=3, header=[0,1])
df = df.reset_index()
df = df.rename(columns=lambda x: x if not 'Unnamed' in str(x) else '')
df = df.rename(columns={'index':'ColA'})
df.columns.names = (None, None)
print(df)
        ColA ColB ColC                 ColD
                     1    2          3     
0 2010-01-01    A    A  2.1 2010-02-01    E
1 2010-01-02    B    C  2.2 2010-02-02    F

【讨论】:

  • 奇怪的是,Unnamed 出现在 ColBColC 而不是 ColA
猜你喜欢
  • 1970-01-01
  • 2021-11-21
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多