如何基于列标题温度对Pandas中的COP值矩阵进行插值?
基于列标题温度的COP值加权插值方案
Pandas自带的interpolate方法确实默认是按列的位置做线性插值,没法直接基于列标题对应的温度值做加权插值,但你不用急着导出数据,两种方案都能解决问题:
方案一:在Pandas中手动实现加权插值
你可以自定义加权逻辑(比如反距离加权),对每一行数据单独处理:
import pandas as pd import numpy as np def weighted_interpolate(row, temp_cols, power=2): # 提取当前行有效温度和对应COP值 valid_mask = ~row.isna() valid_temps = temp_cols[valid_mask] valid_cops = row[valid_mask] # 遍历每个缺失值位置计算插值 for idx, target_temp in enumerate(temp_cols): if pd.isna(row[idx]): # 计算目标温度与有效温度的距离 distances = np.abs(valid_temps - target_temp) # 避免除以0的情况 distances[distances == 0] = 1e-10 # 反距离加权,power越大,近点权重越高 weights = 1 / (distances ** power) # 计算加权平均值 row[idx] = np.sum(valid_cops * weights) / np.sum(weights) return row # 把列标题转为数值型温度数组 temp_columns = df.columns.astype(float) # 对每一行应用插值函数 df_interpolated = df.apply(weighted_interpolate, axis=1, temp_cols=temp_columns)
方案二:用Scipy实现更灵活的加权插值
如果需要更专业的插值算法(比如径向基函数、克里金插值),Scipy的工具会更高效稳定,直接在DataFrame上处理就行:
from scipy.interpolate import Rbf def scipy_interpolate(row, temp_cols): valid_mask = ~row.isna() valid_temps = temp_cols[valid_mask] valid_cops = row[valid_mask] # 创建径向基插值器,可选择不同核函数(linear/cubic/gaussian等) interpolator = Rbf(valid_temps, valid_cops, function='gaussian') # 对所有温度点生成插值结果 interpolated_vals = interpolator(temp_cols) return pd.Series(interpolated_vals, index=row.index) # 应用到整个DataFrame df_interpolated_scipy = df.apply(scipy_interpolate, axis=1, temp_cols=temp_columns)
简单需求用Pandas手动实现足够,复杂插值场景选Scipy更省心,不用额外导出数据。
内容的提问来源于stack exchange,提问作者CromeX
相关产品推荐
相关产品推荐

