Pandas字符串完全包含判断与基于DataFrame的零件分类实现
解决零件分类及字符串包含判断问题
看起来你需要用Pandas DataFrame实现零件描述的自动分类,同时要解决字符串是否包含于另一个DataFrame关键词中的判断问题。我来一步步帮你搞定这个需求:
1. 先明确数据结构
首先,我们先把你给出的初始化代码整理好,确保大家都能复现场景:
import pandas as pd # 零件描述数据 data = {'col1': ['engine','blue engine cover','spark plug', 'rear panel','black rear panel', 'blue engine']} desc_df = pd.DataFrame(data=data) # 分类规则字典转DataFrame catg = { 'bodywork': ['engine cover','side panel','rear panel'], 'underhood':['engine','spark plug','oil filter'], 'Glass':['Windscreen','window','demister'] } catg_df = pd.DataFrame(data=catg)
这里的catg_df是宽格式(列对应分类,行对应该分类的关键词),这种格式不太方便后续的匹配操作,我们先转成更易用的长格式。
2. 转换分类规则为长格式
把宽格式的分类规则转成长格式,每一行对应一个「分类-关键词」对,这样更便于遍历和匹配:
# 转长格式并去除空值(如果有的话) catg_long = catg_df.melt(var_name='category', value_name='keyword').dropna()
转换后的catg_long结构如下:
| category | keyword |
|---|---|
| Glass | Windscreen |
| Glass | window |
| Glass | demister |
| bodywork | engine cover |
| bodywork | side panel |
| bodywork | rear panel |
| underhood | engine |
| underhood | spark plug |
| underhood | oil filter |
3. 实现零件自动分类
接下来我们要给每个零件描述匹配对应的分类。这里有两种常见思路:
思路1:按分类匹配(基础版)
先为每个分类生成关键词的正则匹配模式,然后检查描述是否匹配该分类的任意关键词:
# 按分类分组,拼接关键词为正则模式(|代表逻辑或) catg_patterns = catg_long.groupby('category')['keyword'].apply(lambda x: '|'.join(x)) # 定义分类匹配函数 def get_category(desc): for cat, pattern in catg_patterns.items(): # 忽略大小写匹配 if pd.Series([desc]).str.contains(pattern, case=False).iloc[0]: return cat return 'Uncategorized' # 无匹配时返回未分类 # 给desc_df添加分类列 desc_df['category'] = desc_df['col1'].apply(get_category)
运行后desc_df的结果:
| col1 | category |
|---|---|
| engine | underhood |
| blue engine cover | bodywork |
| spark plug | underhood |
| rear panel | bodywork |
| black rear panel | bodywork |
| blue engine | underhood |
思路2:优先匹配长关键词(进阶版)
如果存在关键词重叠的情况(比如engine和engine cover),我们需要优先匹配更长的关键词,避免短关键词先匹配导致分类错误。这时可以先对关键词按长度降序排序:
# 给关键词添加长度列,按长度降序排序后删除长度列 catg_long_sorted = catg_long.assign(keyword_len=catg_long['keyword'].str.len())\ .sort_values('keyword_len', ascending=False)\ .drop('keyword_len', axis=1) # 定义优先匹配长关键词的函数 def get_category_priority(desc): desc_lower = desc.lower() for _, row in catg_long_sorted.iterrows(): if row['keyword'].lower() in desc_lower: return row['category'] return 'Uncategorized' # 添加优先匹配后的分类列 desc_df['category_priority'] = desc_df['col1'].apply(get_category_priority)
这个版本会确保blue engine cover先匹配到engine cover,归类到bodywork,而不是被engine匹配到underhood。
4. 单独实现字符串包含判断
针对你提到的「如何判断某字符串是否完全包含于另一个pandas DataFrame中?」的问题,我们可以封装一个通用函数:
def is_string_contained_in_df(target_str, df, keyword_col='keyword', case_sensitive=False): """ 判断目标字符串是否包含df中keyword_col列的任意一个关键词 :param target_str: 要检查的目标字符串 :param df: 包含关键词的DataFrame :param keyword_col: 关键词所在的列名,默认是'keyword' :param case_sensitive: 是否区分大小写,默认不区分 :return: 匹配成功返回True,否则返回False """ # 获取所有非空关键词 keywords = df[keyword_col].dropna().tolist() if not keywords: return False # 处理大小写 target_processed = target_str.lower() if not case_sensitive else target_str keywords_processed = [kw.lower() if not case_sensitive else kw for kw in keywords] # 检查是否包含任意关键词 return any(kw in target_processed for kw in keywords_processed) # 测试示例 print(is_string_contained_in_df("blue engine cover", catg_long)) # 输出 True print(is_string_contained_in_df("door handle", catg_long)) # 输出 False
内容的提问来源于stack exchange,提问作者CGully
相关产品推荐
相关产品推荐

