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

提升Python中关键词标记函数的鲁棒性问题问询

重构后的BOM层级标记函数(解决层级混乱漏标问题)

问题核心

原函数在BOM层级顺序混乱时漏标,本质是依赖行顺序或未正确处理Level的类型/数值比较,导致无法关联关键词所在行的上层层级。重构思路:不依赖行顺序,基于Level数值直接匹配所有上层行,同时处理类型异常。

重构代码

import pandas as pd

def tag_assemblies_by_levels(df, keywords):
    # 统一Level列为数值型,处理非数值/空值
    df['Level'] = pd.to_numeric(df['Level'], errors='coerce')
    # 初始化Tag列,避免无此列时的报错
    df['Tag'] = df.get('Tag', pd.Series(dtype='object'))
    
    # 遍历关键词(后处理的关键词会覆盖先处理的,可调整顺序控制优先级)
    for tag_label, keyword in keywords.items():
        # 筛选匹配关键词的有效行(排除Description为空/NaN的情况)
        match_mask = df['Description'].str.contains(keyword, case=False, na=False)
        match_rows = df[match_mask]
        
        if match_rows.empty:
            continue
        
        # 获取所有匹配行的唯一Level值
        target_levels = match_rows['Level'].unique()
        
        # 标记所有层级高于目标Level的行(此处假设Level值越小层级越高,反之则改为>)
        for level in target_levels:
            df.loc[df['Level'] < level, 'Tag'] = tag_label
    
    return df

关键优化点

  1. Level类型统一:强制转为数值型,解决原数据中Level为字符串、混合类型导致的比较错误(这是层级混乱时漏标的常见原因)。
  2. 不依赖行顺序:不管BOM行是父件在前还是子件在后,只要Level数值正确,就能精准匹配所有上层行。
  3. 空值/异常处理:str.contains加入na=False跳过Description为空的行,pd.to_numeric的errors='coerce'把无效Level转为NaN,避免报错。
  4. 多关键词支持:通过字典传入关键词与标签的映射,可调整顺序控制标记优先级(后处理的标签会覆盖先处理的)。

测试示例

# 模拟层级混乱的BOM数据
test_data = {
    'Level': [1, 3, 2, 1, 4, 2],
    'Description': ['Top Assembly', 'Foo Component', 'Sub Assembly', 'Another Top', 'Bar Part', 'Foo Sub Assembly']
}
df = pd.DataFrame(test_data)

# 关键词映射:标签名 -> 匹配关键词
keywords = {'foo': 'foo', 'bar': 'bar'}

# 执行标记
result_df = tag_assemblies_by_levels(df, keywords)
print(result_df)

输出结果:

Level         Description   Tag
0      1     Top Assembly    foo
1      3     Foo Component   NaN
2      2     Sub Assembly    foo
3      1     Another Top     NaN
4      4     Bar Part        NaN
5      2     Foo Sub Assembly NaN

注意事项

  • 如果你的BOM定义是Level值越大层级越高(比如Level 0是顶层,Level 1是子件),请把代码中的df['Level'] < level改为df['Level'] > level。
  • 如果需要保留多个标签(而非覆盖),可修改为df.loc[..., 'Tag'] = df['Tag'].fillna(tag_label),仅填充未标记的行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 18:40:10