如何在Pandas DataFrame中实现线性插值查找?
Pandas原生实现线性插值获取中间值
问题背景
我用Pandas创建了如下DataFrame:
d = {'X': [1, 2, 3], 'Y': [220, 187, 170]} df = pd.DataFrame(data=d)
对应的DataFrame内容:
| X | Y |
|---|---|
| 1 | 220 |
| 2 | 187 |
| 3 | 170 |
通过df[df['X'] == 1.0]['Y']可以获取X=1.0对应的Y值(返回220),但想知道有没有Pandas原生方法,能计算X处于现有值之间时的Y线性插值结果,比如X=1.5时得到203.5。试过interpolate但会修改原DataFrame,也能自己写函数,但想找原生实现方案。
解决方案
方法1:重新索引+插值(不修改原DataFrame)
通过构造包含目标X值的新索引,重新索引后执行插值,完全不改动原数据:
target_x = 1.5 # 整合原X值和目标插值X值并排序 new_x_list = sorted(df['X'].tolist() + [target_x]) # 设X为索引→重新索引→线性插值 interpolated_result = df.set_index('X').reindex(new_x_list).interpolate(method='linear') # 提取目标X对应的Y值 y_value = interpolated_result.loc[target_x, 'Y'] print(y_value) # 输出:203.5
方法2:临时添加行+插值(原DataFrame无变化)
临时把目标X值加入DataFrame,插值后取出结果再丢弃临时数据:
import pandas as pd target_x = 1.5 # 拼接临时行并按X排序 temp_df = pd.concat([df, pd.DataFrame({'X': [target_x], 'Y': [pd.NA]})]).sort_values('X') # 对Y列做线性插值 temp_df['Y'] = temp_df['Y'].interpolate(method='linear') # 获取目标结果 y_value = temp_df[temp_df['X'] == target_x]['Y'].iloc[0] print(y_value) # 输出:203.5
补充:结合numpy.interp高效计算
虽然不是纯Pandas原生,但numpy.interp可以直接配合Pandas数据使用,代码简洁高效,且无需修改原DataFrame:
import numpy as np target_x = 1.5 y_value = np.interp(target_x, df['X'], df['Y']) print(y_value) # 输出:203.5
内容的提问来源于stack exchange,提问作者Graham Tattersall
相关产品推荐
相关产品推荐

