在读取带合并单元格标题的Excel文件时修复DataFrame列

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

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 AA 2.1 2010-02-01 00:00:00 E 2 2010-01-02 BC 2.2 2010-02-02 00:00:00 F 

类似于:

 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]

read_excel的header参数可以帮助:

 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 AA 2.1 2010-02-01 E 2010-01-02 BC 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等列很奇怪。 没有办法解决吗?

这不简单。

首先添加用于创buildMultiIndex参数header ,然后将Unnamed列名称重Unnamed为空string。

 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 AA 2.1 2010-02-01 E 1 2010-01-02 BC 2.2 2010-02-02 F