Pandas DataFrame插值异常:为何a=525时插值结果不符合预期?
问题原因
你当前使用的interpolate(method='linear')默认是基于DataFrame的行索引位置计算插值,而非基于a列的实际数值。当你将待插值行加入并排序后,a=525处于两个原始数据点的行位置之间,插值时按行的位置比例计算,而非a的数值比例,这就导致结果偏离了理论值(d=4*a=2100,e=5*a=2625)。
解决方案
要让插值基于a列的数值进行,有两种可行的修改方式:
方法一:指定插值参考的x轴为a列
直接在interpolate中通过x参数指定参考a列的数值:
import numpy as np import pandas as pd import random # 生成原始数据 a = np.array(random.sample(range(1, 1001), 100)) b = 2* a c = 3* a d = 4* a e= 5* a data = {'a': a, 'b': b, 'c': c, 'd': d, 'e': e} df = pd.DataFrame(data) to_interp = {'a': [200.0, 525.0], 'b': [400.0, 1050.0], 'c': [600.0, 1575.0]} new_df = pd.DataFrame(to_interp) df = pd.concat([df, new_df], ignore_index=True) df.sort_values('a', inplace=True) # 修改插值逻辑,基于a列数值计算线性插值 df['d'] = df['d'].interpolate(method='linear', limit_direction='forward', axis=0, x=df['a']) df['e'] = df['e'].interpolate(method='linear', limit_direction='forward', axis=0, x=df['a']) interpolated_values = df[df['a'].isin(to_interp['a'])][['a', 'b', 'c', 'd', 'e']].copy() print(interpolated_values)
方法二:将a设为索引后使用索引插值
把a列设为DataFrame的索引,使用method='index'基于索引数值插值:
import numpy as np import pandas as pd import random # 生成原始数据 a = np.array(random.sample(range(1, 1001), 100)) b = 2* a c = 3* a d = 4* a e= 5* a data = {'a': a, 'b': b, 'c': c, 'd': d, 'e': e} df = pd.DataFrame(data) to_interp = {'a': [200.0, 525.0], 'b': [400.0, 1050.0], 'c': [600.0, 1575.0]} new_df = pd.DataFrame(to_interp) df = pd.concat([df, new_df], ignore_index=True) # 将a设为索引并排序 df.set_index('a', inplace=True) df.sort_index(inplace=True) # 基于索引数值插值 df['d'] = df['d'].interpolate(method='index', limit_direction='forward') df['e'] = df['e'].interpolate(method='index', limit_direction='forward') # 恢复原索引结构并提取结果 df.reset_index(inplace=True) interpolated_values = df[df['a'].isin(to_interp['a'])][['a', 'b', 'c', 'd', 'e']].copy() print(interpolated_values)
运行上述任意一种修改后的代码,a=525对应的d和e都会得到正确的2100和2625。
内容的提问来源于stack exchange,提问作者xylo
相关产品推荐
相关产品推荐

