You need to enable JavaScript to run this app. Pandas中如何基于关键词匹配规则为数据行分配可重叠的多类别标签
优惠活动
大模型
产品
解决方案
定价
更多

Pandas中如何基于关键词匹配规则为数据行分配可重叠的多类别标签

Pandas实现重叠多分类标签匹配方案

核心问题根源

原来使用的np.select逻辑是按条件顺序返回第一个匹配的结果,只要命中靠前的分类规则,后续的所有匹配判断都会被跳过,因此天然不支持多类别重叠标记。要实现多标签分配,需要为每个分类做独立的命中判断,再汇总所有命中的分类值。
另外注意原代码存在笔误:将分类结果赋值给了description列,会覆盖原始文本内容,实际使用时需要将分类结果赋值给独立的category列,保留原始描述文本。

实现步骤

1. 结构化存储分类词表

先把零散的分类关键词列表打包成字典,避免后续代码重复硬编码:

import pandas as pd
import numpy as np

# 分类关键词映射表
category_keywords = {
    'fashion': ['bag','purse','pen'],
    'general': ['knob','hanger','bottle','printing','tissues','book','tissue','holder','heart'],
    'decor': ['holder','decoration','candels','frame','paisley','bunting','decorations','party','candles','design','clock','sign','vintage','hanging','mirror','drawer','home','clusters','placements','willow','stickers','box'],
    'kitchen': ['pantry','jam','cake','glass','bowl','napkins','kitchen','baking','jar','mug','cookie','bowl','placements','molds','coaster','placemats'],
    'holiday': ['rabbit','ornament','christmas','trinket','party'],
    'garden': ['lantern','hammok','garden','tree'],
    'kids': ['children','doll','birdie','asstd','bank','soldiers','spaceboy','childs']
}

2. 生成独立命中矩阵

逐分类计算文本的命中布尔值,形成和原数据集行数对齐的标记矩阵,每个列对应一个分类的匹配结果:

# 构建分类命中矩阵,每一列对应一个分类的True/False命中标记
match_matrix = pd.DataFrame()
for cat_name, word_list in category_keywords.items():
    # 保持和原逻辑一致的子串匹配,添加case=False可实现忽略大小写匹配
    match_matrix[cat_name] = df['description'].str.contains(
        '|'.join(word_list), 
        na=False,
        case=False
    )

3. 拼接所有命中的分类

逐行汇总命中的分类标签,用逗号拼接成字符串,无任何分类命中时标记为Other:

常规数据量适用版本

def collect_matched_tags(row):
    # 取出该行所有命中为True的分类名
    matched_cats = row[row].index.tolist()
    return ', '.join(matched_cats) if matched_cats else 'Other'

df['category'] = match_matrix.apply(collect_matched_tags, axis=1)

大数据量优化版本

针对十万行以上的大表,逐行apply的性能损耗较高,可直接基于numpy数组操作提升效率:

cat_columns = np.array(match_matrix.columns)
match_flags = match_matrix.values

df['category'] = [
    ', '.join(cat_columns[row_flag]) if row_flag.any() else 'Other'
    for row_flag in match_flags
]

效果验证

使用示例测试数据运行后,输出结果和预期完全匹配:

indexdescriptioncategory
0children wine glasskids, kitchen
1candlesdecor
2christmas treeholiday, garden
3bottlegeneral
4soldierskids
5bagfashion

注意事项

  • 原逻辑的子串匹配存在误判风险:比如包含“glass”子串的无关文本(如“glasses”“glasswork”)都会被判定为命中kitchen分类。如果需要仅匹配完整单词,可将匹配规则修改为带单词边界的正则:
    # 精确全词匹配版本
    import re
    word_pattern = r'\b(' + '|'.join(word_list) + r')\b'
    match_matrix[cat_name] = df['description'].str.contains(
        word_pattern,
        na=False,
        case=False,
        flags=re.IGNORECASE
    )
    
  • 原词表中存在跨分类重复的关键词(如holder同时属于general和decor、party同时属于decor和holiday),上述实现会自动为同时命中多个分类的文本拼接对应标签,不会出现重复分类名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.10 05:24:05