如何使用Imputer填充类将-999替换为上一行同列对应值?
问题解答
方案适配性判断
使用scikit-learn的Imputer填充类不是合适的方案:KNNImputer是基于特征距离计算近邻值填充,无法精准指定仅取用当前单元格的上一行同列数值,反而会引入不必要的计算开销,和需求场景不匹配。
最优实现方式
Pandas自带的前向填充方法即可高效实现需求,不需要自定义循环也不需要调用第三方填充类,仅需2步操作:
- 把数据中的-999替换为标准缺失值NaN
- 调用
ffill()方法,该方法会自动用上一行同列的有效值填充当前行的缺失值
示例代码如下:
import pandas as pd import numpy as np # 构造示例DataFrame df = pd.DataFrame([ [1, 2, 3], [4, -999, 6], [7, 8, 9] ]) # 执行填充逻辑 df = df.replace(-999, np.nan).ffill()
运行后输出结果完全符合预期:
| 0 | 1 | 2 |
|---|---|---|
| 1 | 2 | 3 |
| 4 | 2 | 6 |
| 7 | 8 | 9 |
补充说明
如果你的数据第一行就存在-999的情况,ffill()会保留该位置为NaN,可根据业务需求额外补充第一行的填充逻辑即可。该方法时间复杂度为O(n),性能远高于自定义循环和Imputer类实现。
内容的提问来源于stack exchange,提问作者Bogdan Doicin
相关产品推荐
相关产品推荐

