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

如何用Pandas按ASIL等级规则比较DataFrame列并筛选数据

解决方案

要解决这个问题,核心是先给ASIL等级定义明确的优先级,把字符串转换成可比较的数值,再进行筛选。具体步骤如下:

1. 定义ASIL等级优先级

根据ASIL的层级规则(ASIL D > ASIL C > ASIL B > ASIL A > QM),创建映射字典用数值代表等级高低:

asil_priority = {
    "QM": 0,
    "ASIL A": 1,
    "ASIL B": 2,
    "ASIL C": 3,
    "ASIL D": 4
}

2. 提取核心ASIL等级

数据里部分等级带(D)后缀(比如QM(D)、ASIL C(D)),这些实际等级和括号外内容一致。写个函数提取核心部分:

def get_core_asil(asil_str):
    if pd.isna(asil_str):
        return np.nan
    # 去掉括号及内部内容,保留核心等级
    return asil_str.split('(')[0].strip()

3. 转换为可比较的数值列

对DataFrame的两个ASIL列应用上述函数,再映射成优先级数值:

# 生成需求自身的ASIL优先级数值
df['asil_score'] = df['ASIL level'].apply(get_core_asil).map(asil_priority)
# 生成关联项的ASIL优先级数值
df['linked_asil_score'] = df['linked ASIL level'].apply(get_core_asil).map(asil_priority)

4. 筛选不符合规范的行

筛选需求等级数值小于关联项的行,同时排除关联项等级为空的记录(无法进行有效比较):

# 设定筛选条件
invalid_rows = df[(df['asil_score'] < df['linked_asil_score']) & (~df['linked_asil_score'].isna())]
# 移除临时生成的数值列,保留原数据列
result = invalid_rows.drop(['asil_score', 'linked_asil_score'], axis=1)
print(result)

运行代码后输出结果与期望完全一致:

ID ASIL level linked ID linked ASIL level
0  req_115      QM(D)  arch_932            ASIL D
3  req_982  ASIL C(D)  arch_975            ASIL D
6  req_833         QM  arch_548            ASIL D

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:52:42