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

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结构如下:

categorykeyword
GlassWindscreen
Glasswindow
Glassdemister
bodyworkengine cover
bodyworkside panel
bodyworkrear panel
underhoodengine
underhoodspark plug
underhoodoil 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的结果:

col1category
engineunderhood
blue engine coverbodywork
spark plugunderhood
rear panelbodywork
black rear panelbodywork
blue engineunderhood

思路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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:33:09