如何使用pandas有效读取Excel为DataFrame并填充合并单元格空值
pandas适配Excel合并单元格层级展示逻辑的实现方案
Excel里的合并单元格本质是只在区域首行存储实际值,其余行单元格留空,pandas默认读入时把空值识别为NA是正常现象,用向前填充逻辑就能1:1还原Excel的视觉展示效果,操作步骤如下:
- 第一步:正常读入Excel文件,不需要修改默认读入参数
import pandas as pd # 替换成你自己的文件路径,表头识别异常时可加header参数指定表头行位置 df = pd.read_excel("你的数据集文件.xlsx")
此时读入的DataFrame和你描述的结构一致,Columa_1仅第一行为Germany、其余行为NA,Column_2仅每个分类的第一行有值、对应子项行均为NA。
- 第二步:按从高到低的层级顺序(即从最左列到右列的顺序),对存在合并单元格的列做向前填充
注意:绝对不能打乱列的填充顺序,也不要直接对全表做填充,否则会把非合并列的独立数值、文本错误覆盖。
针对你给出的数据集,仅前两列是合并展示的层级列,第三到第五列每行都有独立值,不需要填充,对应代码如下:
# 按层级从高到低排列需要填充的列名 level_cols = ["Columa_1", "Column_2"] df[level_cols] = df[level_cols].ffill()
ffill()是pandas内置的向前填充方法,逻辑是逐行检测,遇到NA值就取上一行同列的非NA值填充,和Excel合并单元格的取值逻辑完全一致。
填充完成后得到的DataFrame结构如下,和Excel视觉展示的内容完全匹配:
| Columa_1 | Column_2 | Column3 | Column4 | Column5 |
|---|---|---|---|---|
| Germany | Business | Automobile | 32400 | text1 |
| Germany | Business | Pesticide | 348700 | text2 |
| Germany | Business | Chemisty | 97245 | text3 |
| Germany | Homework | Cleaning | 56248 | text3 |
| Germany | Homework | Cooking | 67354 | text4 |
| Germany | Schooling | attending | 78464 | text5 |
常见场景适配说明
- 如果数据集中间存在无意义空行,先执行
df = df.dropna(how="all")删除全空行,再做填充即可,避免空行导致填充值错位。 - 如果层级列超过2列,只要把列名按从左到右的层级顺序加到
level_cols列表里就行,逻辑完全通用。 - 如果部分合并单元格存在空值需要保留,不要直接整列填充,可以先按业务逻辑筛选出需要填充的行区间再单独做ffill。
内容的提问来源于stack exchange,提问作者Violet
相关产品推荐
相关产品推荐

