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

基于范围键字典匹配更新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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:42:18