对存在过合并的excel的单元格进行处理

问题

日常我们经常遇到表头是合并的单元格,如左侧表头,或者上测表头都是合并过的,而我们想读取使用pandas读取的excel后,每列都进行对应回原来的数据的结构,那么这时就需要进行填充了,因为读取后,只有合并的单元格的第一行或第一列是有值的,其它都是nan,我们需要用前向填充的方法,ffill()
示例如图:

填充代码,可以给定超参数,填充表头,按行和按列填充

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import pandas as pd

def fill_pdna(df, row=[], col=[]):
"""
当excel的表头的行或列有合并单元格的情况时,只有第一个单元格是正确的,值,这时候需要使用前向填充ffill,即使用上一个单元格的内容填充当前为nan的单元格
但是填充的时候一般进行限制,只填充表头的前几行,或前几列
:param df:
:type df:
:param row: [] 表示所有行都使用前面的值进行填充,1表示第一行, eg: [1,2] 表示第1,2行用前面的值填充,-1表示不填充
:param col: []表示,所有列都使用前面的值填充, 0表示第一列, 注意行和列的其实索引位置不一样, -1表示不填充
:return:
:rtype:
"""
# 首先对行进行填充,填充哪些行
if not row:
# 如果为空,先按行进行填充,行空的时候使用前一个单元格填充
df = df.ffill(axis=1)
if not col:
# 然后对列进行填充
df = df.ffill(axis=0)
if col and col != [-1]:
for col_num in col:
df[col_num] = df[col_num].ffill(axis=0)
if row and row != [-1]:
for row_num in row:
df[:row_num] = df[:row_num].ffill(axis=1)
return df

def read_excel(excel_file):
"""
读取excel内容
:param excel_file:
:type excel_file:
:return:
:rtype:
"""
print(f"开始读取{excel_file}")
df = pd.read_excel(excel_file, header=None)
newdf = fill_pdna(df, row=[1,2,3], col=[0])
print(newdf)

对存在过合并的excel的单元格进行处理
https://johnson7788.github.io/2022/02/22/pandas-na/
作者
Johnson
发布于
2022年2月22日
许可协议