如何用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
相关产品推荐
相关产品推荐

