1. 为什么简单的ffill填充会毁了你的数据分析?
每次用Pandas读取带合并单元格的Excel时,你是不是也习惯性敲下df.ffill()?这个看似万能的解决方案,其实藏着不少坑。最近我就被这个"行业标准做法"坑惨了——某次月度报表分析时,发现销售数据莫名其妙多了30%的异常值,追查半天才发现是ffill把合并单元格的值填错了位置。
合并单元格在Excel里很常见,比如跨行的部门名称、跨列的季度标题。Pandas读取时会保留左上角单元格的值,其他位置显示为NaN。这时候ffill(向前填充)就像个勤劳但粗心的助手,它会不分青红皂白地把所有空值用上一个非空值填满。听起来合理?看看这两个真实翻车案例:
python复制# 典型的学生成绩表结构
原始数据:
| 班级 | 姓名 | 成绩 | 备注 |
|--------|------|------|--------|
| 一班 | 张三 | 90 | 优秀 |
| [合并] | 李四 | 85 | [合并] |
| [合并] | 王五 | 78 | [合并] |
| 二班 | 赵六 | 92 | 优秀 |
# 使用ffill后的结果:
| 班级 | 姓名 | 成绩 | 备注 |
|------|------|------|------|
| 一班 | 张三 | 90 | 优秀 |
| 一班 | 李四 | 85 | 优秀 | ← 备注被错误填充
| 一班 | 王五 | 78 | 优秀 | ← 班级和备注都错了
| 二班 | 赵六 | 92 | 优秀 |
更可怕的是跨列合并的情况。我曾处理过财务部门的预算表,表头是合并的"Q1-实际/计划"这种结构。ffill之后,实际值和计划值完全混在一起,导致后续的差异分析全部出错。这就是为什么我们需要更精准的解决方案——在填充前先拆解合并单元格的原始结构。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. openpyxl的合并单元格拆解黑科技
openpyxl作为Python操作Excel的瑞士军刀,能直接访问工作表的底层结构。它的merged_cells属性记录了所有合并区域的信息,这是我们解决问题的钥匙。来看关键代码:
python复制def unmerge_and_fill_cells(worksheet):
