You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现:基于前置有效值迭代乘K因子填充缺失NaN值

按前置有效值迭代乘因子填充DataFrame缺失值

我们需要实现一种自定义缺失值填充逻辑:针对DataFrame中的连续NaN缺失段,以该段第一个前置有效值为初始值,迭代乘以固定因子K=0.5,依次填充段内所有NaN,直至遇到下一个有效值。

示例说明

输入表(TABLE A)

索引数值列
08
1NaN
2NaN
316
4NaN
5NaN
6NaN
74

期望输出表(TABLE B)

索引数值列
08
14
22
316
48
54
62
74

为什么df.interpolate()不适用?

pandas内置的df.interpolate()方法,无论使用线性插值、多项式插值还是其他模式,都会同时利用缺失段前后的有效值来计算填充值,完全不符合我们仅依赖前置有效值迭代计算的需求,因此必须自定义填充逻辑。

Python实现代码

import pandas as pd
import numpy as np

# 构造示例输入DataFrame
df = pd.DataFrame({
    '数值列': [8, np.nan, np.nan, 16, np.nan, np.nan, np.nan, 4]
})

# 1. 为每个NaN获取最近的前置有效值
df['前置有效值'] = df['数值列'].ffill()

# 2. 为连续NaN段分配唯一分组ID
# 非NaN行会触发累加,将连续NaN划为同一分组
df['分组ID'] = df['数值列'].notna().cumsum()

# 3. 计算每个NaN在所属段内的偏移位置(从1开始计数)
df['段内偏移'] = df.groupby('分组ID').cumcount()

# 4. 计算填充值:仅对NaN行应用迭代乘因子逻辑
df['填充后数值'] = np.where(
    df['数值列'].isna(),
    df['前置有效值'] * (0.5 ** df['段内偏移']),
    df['数值列']
)

# 5. 清理临时列并得到结果
result_df = df.drop(['前置有效值', '分组ID', '段内偏移', '数值列'], axis=1).rename(columns={'填充后数值': '数值列'})

# 打印结果
print(result_df)

代码逻辑解释

  • ffill():向前填充,确保每个NaN位置都能获取到最近的有效前置值
  • cumsum():对非NaN行的布尔值累加,为每个连续缺失段生成唯一分组ID
  • cumcount():统计每个分组内的元素位置,作为迭代乘因子的指数(第1个NaN对应指数1,第2个对应指数2,以此类推)
  • np.where():精准定位NaN位置,应用初始值 × (0.5^偏移量)的计算逻辑,保留原有效值不变

内容的提问来源于stack exchange,提问作者gveronese

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 14:40:50