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

如何用Scipy的三次样条插值填充数据集中的NaN值?

解决CubicSpline因NaN报错及合理填充缺失值的方法

用0填充NaN会破坏数据趋势,导致样条曲线异常,你可以通过以下两种方式合理填充缺失值,再构建三次样条:

方法一:手动基于有效点构建样条填充

  1. 先提取数据中r列非NaN的有效点,用这些点创建初始三次样条
  2. 用这个样条函数计算所有t对应的插值结果,替换原数据中的NaN
  3. 用填充后的完整数据构建最终的三次样条

代码示例:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 04:25:04