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
相关产品推荐
相关产品推荐

