基于多项式函数按规则填充DataFrame中NaN值的技术请求
用多项式函数按规则填充DataFrame中的NaN值
解决方案代码
首先导入所需库:
import pandas as pd import numpy as np from scipy.interpolate import interp1d
定义处理单行NaN填充的函数,严格匹配规则要求:
def fill_nan_with_polynomial(row): # 获取该行的目标最大值(最后一列) max_val = row.iloc[-1] # 提取需要填充的列(排除最后一列的最大值列) fill_cols = row.index[:-1] row_data = row[fill_cols].copy() # 无NaN则直接返回 nan_mask = row_data.isna() if not nan_mask.any(): return row # 获取NaN区间前的最后一个有效值 filled_temp = row_data.ffill() first_nan_idx = nan_mask.idxmax() start_val = filled_temp.loc[first_nan_idx] # 处理开头即为NaN的边界情况 if pd.isna(start_val): start_val = max_val # 起始值等于最大值时,直接用最大值填充所有NaN if np.isclose(start_val, max_val): row_data[nan_mask] = max_val row[fill_cols] = row_data return row # 确定填充区间的位置索引 nan_positions = np.where(nan_mask)[0] start_pos = nan_positions[0] - 1 end_pos = len(fill_cols) - 1 # 构建插值所需的已知点 x_known = [start_pos, end_pos] y_known = [start_val, max_val] # 创建二次多项式插值函数(可替换为'cubic'使用三次多项式) poly_func = interp1d(x_known, y_known, kind='quadratic') # 生成填充值并确保严格递增 fill_vals = poly_func(nan_positions) fill_vals = np.maximum.accumulate(fill_vals) # 填充NaN并返回结果行 row_data.iloc[nan_positions] = fill_vals row[fill_cols] = row_data return row
将函数应用到整个DataFrame:
filled_df = hi_1_df.apply(fill_nan_with_polynomial, axis=1)
关键说明
- 规则匹配:函数优先判断起始有效值与最大值是否相等,满足条件时直接填充最大值;否则用多项式生成平滑递增的填充值。
- 插值选择:使用二次/三次多项式插值确保填充值的增长趋势更贴合真实数据的非线性特征,若需要线性增长可将
kind参数改为'linear'。 - 边界处理:针对行首就出现NaN的情况,直接用最大值填充;同时通过
np.maximum.accumulate避免多项式插值可能出现的局部下降,保证严格递增。 - 性能适配:1110行的规模下,
apply方法的执行效率完全可接受;若需进一步优化,可基于向量化逻辑重构,但当前实现更直观易维护。
注意事项
- 若你的最大值列不是DataFrame的最后一列,需修改
max_val = row['Max_Capacity'](替换为实际列名)。 - 若存在多段独立的NaN区间(同一行中NaN被有效值分隔),可扩展函数逻辑,遍历每段NaN区间分别执行填充逻辑。
内容的提问来源于stack exchange,提问作者Leila Amani
相关产品推荐
相关产品推荐

