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

如何基于列标题温度对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 06:07:11