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

Python条件线性插值问题:if-else语句执行不符合预期

问题:if-else逻辑错误导致插值结果不符合预期

我编写的if-else语句执行不符合预期。以下是示例数据集:data1_df是用于根据地区进行线性插值的参考表,data2_df包含账户级别的地区和分数信息。

import pandas as pd
from scipy.interpolate import interp1d

data1 = {'Central' : [10, 20, 50],
         'Greater London' : [15, 40, 50],
         'Rest of Uk' : [5, 14, 20],
         'Value' : [5, 4, 3]}

data2 = {'Account' : [1, 2, 3],
         'Location' : ['Central', 'Greater London', 'Rest of Uk'],
         'Score' : [25, 45, 18]}

data1_df = pd.DataFrame(data1)
data2_df = pd.DataFrame(data2)

print(data1_df)
print(data2_df)

需要基于data2_df中对应地区的Score,利用data1_df的数据计算线性插值结果。但运行以下代码后,新列"Value Interpolated"的结果不符合预期,所有地区都执行了Rest of Uk对应的插值逻辑:

for index, row in data2_df.iterrows():
    Location = row['Location']

if Location == 'Central':
    interp_central_london = interp1d(data1_df['Central'], data1_df['Value'], kind='linear',fill_value='extrapolate') 
    value_interp = data2_df['Score']
    score_interp = interp_central_london(value_interp)
    data2_df['Value Interpolated'] = score_interp
    
elif Location == 'Greater London':
    interp_greater_london = interp1d(data1_df['Greater London'], data1_df['Value'], kind='linear',fill_value='extrapolate') 
    value_interp = data2_df['Score']
    score_interp = interp_greater_london(value_interp)
    data2_df['Value Interpolated'] = score_interp
    
else:
    interp_rest_uk = interp1d(data1_df['Rest of Uk'], data1_df['Value'], kind='linear',fill_value='extrapolate') 
    value_interp = data2_df['Score']
    score_interp = interp_rest_uk(value_interp)
    data2_df['Value Interpolated'] = score_interp

print(data2_df)

错误原因

  1. 循环逻辑无效:for循环仅遍历data2_df的每一行,最终只把最后一行的Location赋值给变量,循环结束后才执行if-else判断,导致只会基于最后一个地区(Rest of Uk)的逻辑处理整个Score列。
  2. 批量覆盖结果:每个if-else分支都会对整个data2_df['Score']列计算插值并覆盖新列,最终仅保留最后一次分支的计算结果。

修正方案

预先生成各地区的插值函数,使用apply逐行匹配对应地区的函数计算结果:

import pandas as pd
from scipy.interpolate import interp1d

# 预先生成各地区的插值函数
interp_funcs = {
    'Central': interp1d(data1_df['Central'], data1_df['Value'], kind='linear', fill_value='extrapolate'),
    'Greater London': interp1d(data1_df['Greater London'], data1_df['Value'], kind='linear', fill_value='extrapolate'),
    'Rest of Uk': interp1d(data1_df['Rest of Uk'], data1_df['Value'], kind='linear', fill_value='extrapolate')
}

# 定义逐行计算逻辑
def get_interpolated_value(row):
    return interp_funcs[row['Location']](row['Score'])

# 生成插值结果列
data2_df['Value Interpolated'] = data2_df.apply(get_interpolated_value, axis=1)

print(data2_df)

运行结果

Account       Location  Score  Value Interpolated
0        1        Central     25                 3.5
1        2  Greater London     45                 3.2
2        3     Rest of Uk     18                 2.6

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:33:31