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

如何在Pandas DataFrame中按行线性插值并添加为新列?

解决Pandas DataFrame按行线性插值并添加新列的问题

错误原因分析

你之前的代码报错ValueError: object of too small depth for desired array,核心问题是**np.interp的参数顺序完全搞反了**,同时lambda里的取值逻辑也有问题:

  • np.interp的标准用法是np.interp(x, xp, fp):
    • x:需要插值的目标点(这里是你要的1.1)
    • xp:已知的x坐标数组(对应你的cols=[1,2])
    • fp:和xp一一对应的y值数组(也就是每行的列数值)
  • 你把cols和1.1的位置写反了,第二次尝试里直接调用df[list(df.columns)]是取整个DataFrame,不是当前行的数值,这也会导致维度不匹配。

基础修复方案

先修正参数顺序和行取值逻辑,用apply实现需求:

import pandas as pd
import numpy as np

# 示例数据
df = pd.DataFrame({"x1": [0, 0, 0], "x2": [10, 10, 10]})
cols = [1, 2]  # 列对应的x值
target_x = 1.1  # 要插值的目标点

# 正确的逐行插值写法
df["int"] = df.apply(lambda row: np.interp(target_x, cols, row.values), axis=1)
print(df)

运行后输出符合预期:

x1  x2  int
0   0  10  1.0
1   0  10  1.0
2   0  10  1.0

计算逻辑:x=1.1在1和2之间,线性插值结果为 0 + (10-0)*(1.1-1)/(2-1) = 1.0。

高性能优化方案(针对大尺寸数据)

你的数据有5000列、200行,用apply逐行循环效率较低,推荐用numpy向量化操作直接处理整个DataFrame,速度会提升很多:

# 将DataFrame转为numpy二维数组
fp_array = df.to_numpy()
# 向量化执行插值,得到一维结果数组
interp_results = np.interp(target_x, cols, fp_array)
# 将结果转为DataFrame的新列
df["int"] = interp_results

这个方法直接对整个数组做运算,避免了逐行循环的开销,适合大规模数据场景。

不同行数值的验证测试

如果每行的列数值不同,比如测试下面的例子:

df = pd.DataFrame({"x1": [0, 2, 5], "x2": [10, 20, 15]})
cols = [1,2]
target_x = 1.1
df["int"] = np.interp(target_x, cols, df.to_numpy())
print(df)

输出结果:

x1  x2   int
0   0  10   1.0
1   2  20   4.0
2   5  15   5.5

每一行的插值结果都符合线性计算逻辑,验证正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:10:36