基于范围键字典匹配更新DataFrame中ATS字段的异常排查
问题分析与解决方案
核心问题:用range对象作为字典键时,字典的匹配逻辑是精确匹配对象本身,而非判断数值是否在range范围内。你的原函数大概率是直接用CL数值去查字典(比如CB.get(cl_val, 0)),但数值不等于任何一个range键,所以返回默认值0,导致MTR类型的结果不符合预期。
修复步骤与代码示例
方法1:遍历原CB字典的range键匹配
重写ATS_szng函数,遍历CB的每个range键,检查CL值是否在该范围内,匹配成功则返回对应值:
import pandas as pd CB = {range(1,16):16, range(17,20):20, range(21,32):32, range(33,40):40} data = {'CL':[0.027, 0.350, 1.15, 3.5], 'TYP':['LTG', 'CO', 'MTR', 'ACU'], 'ATS':[0, 0, 0, 0] } df = pd.DataFrame(data) def ATS_szng(row): cl_val = row['CL'] for rng, ats_val in CB.items(): if cl_val in rng: return ats_val return 0 # 应用函数更新ATS字段 df['ATS'] = df.apply(ATS_szng, axis=1) print(df)
运行后输出:
CL TYP ATS 0 0.027 LTG 0 1 0.350 CO 0 2 1.150 MTR 16 3 3.500 ACU 16
方法2:优化CB结构(推荐)
将CB重构为区间列表,避免使用range作为字典键,逻辑更直观且效率更高:
# 重构为(下限, 上限, ATS值)的列表,对应原range的左闭右开规则 CB_OPTIMIZED = [ (1, 16, 16), (17, 20, 20), (21, 32, 32), (33, 40, 40) ] def ATS_szng_optimized(row): cl_val = row['CL'] for lower, upper, ats_val in CB_OPTIMIZED: if lower <= cl_val < upper: return ats_val return 0 df['ATS'] = df.apply(ATS_szng_optimized, axis=1)
该方法与方法1效果一致,但避免了range对象的匹配歧义,更易维护。
内容的提问来源于stack exchange,提问作者Kram R
相关产品推荐
相关产品推荐

