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)
错误原因
- 循环逻辑无效:
for循环仅遍历data2_df的每一行,最终只把最后一行的Location赋值给变量,循环结束后才执行if-else判断,导致只会基于最后一个地区(Rest of Uk)的逻辑处理整个Score列。 - 批量覆盖结果:每个
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
相关产品推荐
相关产品推荐

