如何用Scipy的三次样条插值填充数据集中的NaN值?
解决CubicSpline因NaN报错及合理填充缺失值的方法
用0填充NaN会破坏数据趋势,导致样条曲线异常,你可以通过以下两种方式合理填充缺失值,再构建三次样条:
方法一:手动基于有效点构建样条填充
- 先提取数据中
r列非NaN的有效点,用这些点创建初始三次样条 - 用这个样条函数计算所有
t对应的插值结果,替换原数据中的NaN - 用填充后的完整数据构建最终的三次样条
代码示例:
import pandas as pd import numpy as np from scipy.interpolate import CubicSpline # 原始数据 df = pd.DataFrame() df['t'] = np.arange(1,11) n = np.nan df['r'] = [0, n, n, 0.5, n, 0.3, n, n, n, 0.4] # 提取有效数据点 valid_mask = df['r'].notna() t_valid = df['t'][valid_mask] r_valid = df['r'][valid_mask] # 基于有效点构建样条 cs_valid = CubicSpline(t_valid, r_valid) # 填充NaN值 df['r_filled'] = cs_valid(df['t']) # 构建完整的三次样条 cs_final = CubicSpline(df['t'], df['r_filled']) # 测试插值结果 print(cs_final(2)) # 输出t=2处的插值结果
方法二:用Pandas内置插值快速填充
Pandas的interpolate方法支持直接指定三次样条插值,代码更简洁:
import pandas as pd import numpy as np from scipy.interpolate import CubicSpline # 原始数据 df = pd.DataFrame() df['t'] = np.arange(1,11) n = np.nan df['r'] = [0, n, n, 0.5, n, 0.3, n, n, n, 0.4] # 用三次样条插值填充NaN df['r_filled'] = df['r'].interpolate(method='cubic') # 构建最终的三次样条 cs_final = CubicSpline(df['t'], df['r_filled'])
两种方法填充的NaN值都会贴合已知点的趋势,避免了填0导致的曲线突变和波动,确保构建的三次样条光滑连续。
内容的提问来源于stack exchange,提问作者StungInDaBut
相关产品推荐
相关产品推荐

