如何高效为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'])
方案说明
- 正则模式构建:用
re.escape()转义分类项中的特殊字符(如&、.等),避免正则语法错误;用^限定开头匹配,|分隔多个分类项,确保只匹配以分类项开头的字符串。 - 向量化提取:
str.extract()是Pandas批量字符串操作,一次性处理所有行,比循环遍历效率高几个数量级。 - 缺失值填充:
fillna()批量替换未匹配到的NaN值为原字符串,完成最终赋值。
运行上述代码后,即可得到与预期一致的结果。
内容的提问来源于stack exchange,提问作者Ewdlam
相关产品推荐
相关产品推荐

