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

如何高效为Pandas DataFrame按字符串前缀匹配添加分类列?

问题描述

已知分类列表 L_known_categories = ["Orange","Green","Red","Black & White"],列表内元素互不包含;现有包含Items列的Pandas DataFrame,需添加Category列,规则如下:

  • 若Items中的字符串(不区分大小写)以某已知分类项开头,Category取该分类项
  • 无匹配项时,Category取原字符串

因实际数据集规模大,循环方法效率过低,需高效实现方案。

示例输入

import pandas as pd
df = pd.DataFrame({
    "Items": [
        "green apple", 
        "blue bottle", 
        "RED APPLE", 
        "Green paper", 
        "Black & White glasses", 
        "An orange fruit"
    ]
})

预期输出

Items         Category
0            green apple            Green
1            blue bottle      blue bottle
2              RED APPLE              Red
3            Green paper            Green
4  Black & White glasses    Black & White
5        An orange fruit  An orange fruit

高效实现方案

利用Pandas的向量化字符串操作实现,完全避免循环,处理大数据集效率极高:

实现代码

import pandas as pd
import re

L_known_categories = ["Orange","Green","Red","Black & White"]

# 构建正则匹配模式:匹配以任一分类项开头(自动转义特殊字符,避免正则语法冲突)
pattern = '^(' + '|'.join(re.escape(cat) for cat in L_known_categories) + ')'

# 提取匹配的分类项(flags=re.IGNORECASE 实现不区分大小写匹配)
df['Category'] = df['Items'].str.extract(pattern, flags=re.IGNORECASE)

# 将未匹配到的结果(NaN)替换为原字符串
df['Category'] = df['Category'].fillna(df['Items'])

方案说明

  1. 正则模式构建:用re.escape()转义分类项中的特殊字符(如&、.等),避免正则语法错误;用^限定开头匹配,|分隔多个分类项,确保只匹配以分类项开头的字符串。
  2. 向量化提取:str.extract()是Pandas批量字符串操作,一次性处理所有行,比循环遍历效率高几个数量级。
  3. 缺失值填充:fillna()批量替换未匹配到的NaN值为原字符串,完成最终赋值。

运行上述代码后,即可得到与预期一致的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 23:18:32