Excel文件中可能包含合并单元格的数据,如以下形式,直接使用pandas进行处理会带来问题。
excel.png
首先明确合并单元格存储数据原理,即数据只存储在合并单元格的左上角,其他位置存储的是NaN。
- 处理表头
将以上表格的表头处理成['姓名', '基本信息_身高', '基本信息_体重', '基本信息_性别', ’成绩', '成绩']
def parse_header(df, skiprows, nrows):
# 提取表头df,其中skiprows表示表格前的空行,nrows表示表头的行数,重新建立index
head_df = df.loc[skiprows: skiprows+nrows-1]
head_df = head_df.reset_index(drop=True)
# 处理合并单元格,填充NaN
head_df = head_df.fillna(method='ffill', axis=0)
head_df = head_df.fillna(method='ffill', axis=1)
# 建立表头
head_df.loc[nrows] = ''
head_df.loc[nrows] = head_df.apply(process_header, args=(nrows,))
df = df.loc[skiprows+nrows:]
df = df.reset_index(drop=True)
df.columns = list(head_df.loc[nrows])
return df
def process_header(x, index_range):
header = x.loc[0]
for i in range(index_range-1):
if x.loc[i] != x.loc[i+1]:
header = header + '_' + x.loc[i+1]
return header
- 处理数据
因为成绩列合并了两列单元格,上述处理会带来重复表头问题,同时数据中也存在合并单元格问题,数据只存在最左单元格中。需要删除重复表头,保留数据列
temp_df = df.T
df = temp_df[~temp_df.index.duplicated(keep='first')].T