Python实现:基于前置有效值迭代乘K因子填充缺失NaN值
按前置有效值迭代乘因子填充DataFrame缺失值
我们需要实现一种自定义缺失值填充逻辑:针对DataFrame中的连续NaN缺失段,以该段第一个前置有效值为初始值,迭代乘以固定因子K=0.5,依次填充段内所有NaN,直至遇到下一个有效值。
示例说明
输入表(TABLE A)
| 索引 | 数值列 |
|---|---|
| 0 | 8 |
| 1 | NaN |
| 2 | NaN |
| 3 | 16 |
| 4 | NaN |
| 5 | NaN |
| 6 | NaN |
| 7 | 4 |
期望输出表(TABLE B)
| 索引 | 数值列 |
|---|---|
| 0 | 8 |
| 1 | 4 |
| 2 | 2 |
| 3 | 16 |
| 4 | 8 |
| 5 | 4 |
| 6 | 2 |
| 7 | 4 |
为什么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行的布尔值累加,为每个连续缺失段生成唯一分组IDcumcount():统计每个分组内的元素位置,作为迭代乘因子的指数(第1个NaN对应指数1,第2个对应指数2,以此类推)np.where():精准定位NaN位置,应用初始值 × (0.5^偏移量)的计算逻辑,保留原有效值不变
内容的提问来源于stack exchange,提问作者gveronese
相关产品推荐
相关产品推荐

