Python处理Excel时如何自动填充Score列空单元格为上一行非空值
问题场景
需要处理Excel数据,将Score列的空单元格自动填充为同列上一个非空分数值:
- 原始数据结构
| Name | Score | |Alex | 83.5 | |Annie | | |Bob | | |Lucy | 243.1 | |David | | |Kate | | |Cathrine | | |Rose | 757.5 | |Mary | | |Johnny | | |Roy | |
- 预期处理结果
| Name | Score | |Alex | 83.5 | |Annie | 83.5 | |Bob | 83.5 | |Lucy | 243.1 | |David | 243.1 | |Kate | 243.1 | |Cathrine | 243.1 | |Rose | 757.5 | |Mary | 757.5 | |Johnny | 757.5 | |Roy | 757.5 |
原代码错误点
原编写的pandas代码存在3个问题,无法正常运行:
df = pd.read_excel('C:/Users/Data.xlsx') for i, j in enumerate(df['Score']): if j() == '': df.at[i,'Score'] = df.at[i-1,'Score']
- 语法错误:遍历得到的
j是单元格的值,不是可调用的函数,写j()会直接触发运行报错 - 空值判断逻辑错误:pandas读取Excel时,空单元格会被解析为浮点类型的空值
NaN,不是空字符串'',判断条件永远不成立 - 实现方式低效且有隐患:手动写循环遍历pandas数据运行效率低,若首行是空值,
i-1会取到数据表最后一行的值,出现逻辑错误
正确实现方案
pandas内置了专门处理向前填充场景的ffill()(forward fill)方法,不需要手动写循环,一行代码即可实现需求:
import pandas as pd # 读取原始Excel文件 df = pd.read_excel('C:/Users/Data.xlsx') # 对Score列执行向前填充:空值自动取上一个非空值 df['Score'] = df['Score'].ffill() # 如需将处理结果保存为新的Excel文件,取消注释下面一行即可 # df.to_excel('C:/Users/处理后的数据.xlsx', index=False)
补充说明:如果需要对整个数据表所有列都做「用上一个非空值填空」的操作,直接写
df = df.ffill()即可,该方法是pandas原生实现,运行效率远高于手动写循环,也不会出现索引越界、判断逻辑失效的问题。
内容的提问来源于stack exchange,提问作者CHL
相关产品推荐
相关产品推荐

