pandas数据分析40——读取 excel 合并单元格的表头

案例背景

真的很容易疯....上班的单位的表格都是不同的人做的,所以就会出现各种合并单元格的情况,要知道我们用pandas读取数据最怕合并单元格了,因为没规律...可能前几列没合并,后面几列又合并了....而且pandas对于索引很严格,这种合并单元读取进来就是空的,还怎么查找数据......例如:

 还有这种:

 读取的时候....真的很无语。虽然手工做的表头方便人看,但真的不方便代码来取数。

下面我们来看看怎么自动化读取这种多合并表格的数据,并规范表头。就用这个资产的样例


代码实现

读取数据,前2行都是标题没用跳过,然后header=0,1表示2行作为多层索引。

name='资产类别统计表2023.7.xlsx'

df=pd.read_excel(f'{name}',skiprows=2,header=[0,1],converters={'类别编号': str})
df.head(3)

 

可以看到有‘unnamed’这种合并单元出现的空值的情况。 

我们可以打印查看一下行索引名称:

df.columns

 像这种只有部分下面缺失的,可以直接用上面的第一层索引填充第二层索引,让它还是两层索引,然后继续做多层索引数据框。

cols = df.columns.map(lambda x: [x[0]if 'Unnamed' in i else i for i in x])
multi_cols = pd.MultiIndex.from_arrays([list(col) for col in zip(*cols)])
df.columns=multi_cols
df.head(2)

 这样就是处理好, 然后按照多层索引的方法去进行取数。

若多层索引不熟悉,只想变成正常 的二维数据框,那么就这样:

cols = df.columns.map(lambda x: ''.join('' if 'Unnamed' in i else i for i in x))
cols

 把第一层和第二层的名称都进行合并,然后赋值:
 

df.columns=cols
df.head(2)

 这样就变成了单层数据框,完成!

后面就正常的pandas索引进行取数修改筛选计算等工作了。

### 使用 Python Pandas 或 Openpyxl 读取带有合并单元表头Excel 数据 #### 方法一:使用 `Pandas` 处理合并单元的数据填充 当遇到包含合并单元的情况时,可以利用 `pandas` 的前向填充功能来处理缺失值。通过这种方式,能够确保所有的空白单元被其上方的有效值所替代。 ```python import pandas as pd df = pd.read_excel('example_with_merged_cells.xlsx', engine='openpyxl') # 对特定列应用向前填充方法,这里假设'行业'列为需要处理的对象 df['行业'] = df['行业'].ffill() print(df) ``` 此代码片段展示了如何加载一个 Excel 文件并针对其中某一列执行前向填充操作[^2]。 #### 方法二:使用 `Openpyxl` 获取原始数据结构 如果希望保留原有的合并单元信息而不做任何修改,则可以直接借助于 `openpyxl` 库来进行更底层的操作: ```python from openpyxl import load_workbook wb = load_workbook(filename='example_with_merged_cells.xlsx') ws = wb.active for merged_cell_range in ws.merged_cells.ranges: min_col, min_row, max_col, max_row = range_boundaries(str(merged_cell_range)) top_left_value = ws.cell(row=min_row, column=min_col).value for row in range(min_row, max_row + 1): for col in range(min_col, max_col + 1): current_cell = ws.cell(row=row, column=col) if not (row == min_row and col == min_col): # 不覆盖原顶部左角单元 current_cell.value = top_left_value data = ws.values columns = next(data)[0:] df = pd.DataFrame(data, columns=columns) print(df) ``` 上述脚本首先遍历所有已知的合并区域,并将这些区域内每个单元设置为其所在组中的第一个非空值;之后再转换为 DataFrame 形式以便进一步分析[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阡之尘埃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值