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

Pandas中interpolate方法无法填充NaN值问题求助

使用pandas的interpolate()填充DataFrame中的NaN值

没问题!我来帮你搞定用插值法替代填0来处理DataFrame缺失值的操作,直接上干货:

首先先还原你的示例DataFrame(方便后续测试验证):

import pandas as pd
import numpy as np

# 构建你的原始数据
data = {
    'weight': [np.nan, 55.6, 42.8, 60.8, np.nan, 60.0, np.nan, np.nan, np.nan, 57.0, 46.0],
    'height': [np.nan, 151.0, 151.0, 155.0, np.nan, np.nan, np.nan, np.nan, np.nan, 158.0, np.nan],
    'wc': [np.nan, np.nan, 73.0, np.nan, np.nan, 87.0, np.nan, np.nan, np.nan, 95.0, 83.0],
    'hc': [np.nan, np.nan, 79.0, np.nan, np.nan, 92.0, np.nan, np.nan, np.nan, 90.0, np.nan],
    'FBS': [np.nan, 126.0, np.nan, 201.0, np.nan, np.nan, np.nan, np.nan, 194.0, np.nan, np.nan],
    'HBA1C': [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]
}

df = pd.DataFrame(data)

1. 基础线性插值(最常用)

默认情况下,interpolate()会对每一列执行线性插值——用前后非NaN的数值计算中间缺失值的趋势值,这比直接填0要贴合数据逻辑得多:

# 执行线性插值填充
df_filled = df.interpolate()

# 查看填充后的结果
print(df_filled.head(11))

比如weight列第4行的NaN,会被填充为前后值的均值(60.8+60.0)/2=60.4;而开头/结尾没有前后参考的NaN(比如第0行的所有值),线性插值不会强制填充,避免无意义的推测。

2. 选择不同的插值方法

如果线性插值不符合你的数据特性,还可以指定其他插值逻辑:

  • method='nearest':用最近的非NaN值填充,适合离散型数据
  • method='spline':用样条曲线拟合插值,适合有连续趋势的数据
  • method='time':如果你的索引是时间格式,会按时间间隔比例插值

示例代码:

# 最近邻插值
df_nearest = df.interpolate(method='nearest')

# 3阶样条曲线插值
df_spline = df.interpolate(method='spline', order=3)

3. 自定义插值规则

  • 限制连续填充的NaN数量:比如只填充最多2个连续的NaN,避免用太远的数据过度推测
df_limit = df.interpolate(limit=2)
  • 按行插值(不推荐你的生理数据场景,仅作参考):如果需要横向按行插值,设置axis=1
df_row = df.interpolate(axis=1)

⚠️ 注意:像HBA1C这种全列都是NaN的情况,interpolate()无法填充——因为没有任何参考数据,这种情况你可能需要单独处理(比如删除列或用全局统计值填充,但这就超出插值法的适用范围了)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:26:26