三角DataFrame中NaN值的插补/预测方法咨询(规避单样本循环线性回归)
针对三角缺失DataFrame的简便插补方案
方法1:镜像填充(对称矩阵专属,最简便)
如果你的矩阵是对称结构(比如相关系数矩阵、距离矩阵),直接把上三角的值镜像到下三角,一行代码就能搞定:
import pandas as pd # 假设你的DataFrame名为df df_filled = df.where(~df.isna(), df.T)
原理:利用转置矩阵df.T的对称特性,通过where方法将原矩阵的NaN位置替换为转置后对应位置的有效值。
方法2:趋势类填充(非对称场景适用)
如果矩阵非对称,比如时间序列滞后矩阵、面板数据结构,可以用以下两种内置方法批量填充:
线性插值
根据行/列已有数值的线性趋势补全缺失值,无需循环:
# 按行插值:适合每行有连续递增/递减趋势的场景 df_filled = df.interpolate(axis=1, method='linear') # 按列插值:适合列维度有明显趋势的场景 df_filled = df.interpolate(axis=0, method='linear')
滚动均值填充
针对数据波动较小的场景,用已有值的滚动均值填充该行/列的NaN:
# 按行取前3个非NaN值的滚动均值填充缺失项 df_filled = df.apply(lambda row: row.fillna(row.dropna().rolling(3, min_periods=1).mean().iloc[-1]), axis=1)
方法3:批量机器学习填充(精准度更高)
如果需要更精准的预测填充,可采用批量处理的机器学习方法,完全规避单样本循环:
KNN插补
基于样本相似度批量填充,用sklearn内置工具实现:
from sklearn.impute import KNNImputer imputer = KNNImputer(n_neighbors=3) df_filled = pd.DataFrame(imputer.fit_transform(df), columns=df.columns, index=df.index)
原理:通过计算每行与其他行的相似度,选取最相似的3行有效值的均值填充缺失项,全程批量运算。
SVD矩阵分解填充
利用奇异值分解重构完整矩阵,适合大规模缺失矩阵:
from fancyimpute import SoftImpute # SoftImpute基于SVD实现低秩矩阵重构,自动填充缺失值 df_filled = pd.DataFrame(SoftImpute().fit_transform(df), columns=df.columns, index=df.index)
内容的提问来源于stack exchange,提问作者Muhammad Osama
相关产品推荐
相关产品推荐

