Pandas是否有标准函数可在查找表中进行值插值查询?
解决DataFrame查找表的双轴插值查询问题
你需要的是对行、列均为离散索引的DataFrame进行双线性插值查询,也就是在两个维度的索引间隙中计算中间值。Pandas本身没有直接的lookup类函数支持这种跨维度的插值查询,但可以通过以下几种高效方式实现:
方法一:用scipy.interpolate.interp2d实现双线性插值
这是最直接的插值方案,适合需要精确插值结果的场景:
import pandas as pd from scipy.interpolate import interp2d # 定义原始查找表 d = {-7: [3.6,2.6,2.25,2], 0: [4.3,2.8,2.5,2.2], 5: [4.8,3.1,2.7,2.4], 10: [5.5,3.5,3,2.6], 15: [6.5,4,3.4,2.8]} table = pd.DataFrame(data=d, index=[35,55,65,75]) # 提取行、列索引和表格数据 x = table.columns.values # 列索引:[-7,0,5,10,15] y = table.index.values # 行索引:[35,55,65,75] z = table.values # 表格数值 # 创建双线性插值函数 interp_func = interp2d(x, y, z, kind='linear') # 查询(-2, 38)对应的插值结果 result = interp_func(-2, 38) print(result) # 输出:[[4.02]]
方法二:用Pandas原生reindex+插值(分步单轴处理)
如果不想依赖Scipy,可以用Pandas自身的插值能力,先对列插值,再对行插值:
# 第一步:对列插值,生成包含目标列-2的临时表 col_interp = table.reindex(table.columns.union([-2]), axis=1).interpolate(method='linear', axis=1) # 第二步:对行插值,查询目标行38的值 row_interp = col_interp.reindex(col_interp.index.union([38]), axis=0).interpolate(method='linear', axis=0) # 获取最终结果 result = row_interp.loc[38, -2] print(result) # 输出:4.02
补充说明
- 两种方法都能得到相同的双线性插值结果
4.02,对应你要查询的(-2,38)坐标。 - 若查找表是规则网格(行、列索引均单调有序),两种方法都适用;如果是非规则网格,
interp2d的兼容性更好。 - 批量查询多个坐标时,
interp_func可直接接收数组参数,效率更高。
内容的提问来源于stack exchange,提问作者Merp
相关产品推荐
相关产品推荐

