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

