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

如何在pandas中通过字符串搜索为字符串列分配多个额外标签

问题根因

你当前使用的str.extract()方法仅会返回每条文本中第一个匹配到的正则分组,因此只会输出首个命中的标签,无法捕获同一条文本中多个匹配的分类。


解决方案1:按分类逐次判断命中(易读易维护)

遍历所有分类,直接判断每条文本是否包含该分类下的任意关键词,最后聚合所有命中的分类:

import pandas as pd

entertainment_dict = {
  "Food": ["McDonald", "Five Guys", "KFC"],
  "Music": ["Taylor Swift", "Jay Z", "One Direction"],
  "TV": ["Big Bang Theory", "Queen of South", "Ted Lasso"]
}

data = {'text':["Kevin Lee has bought a Taylor Swift's CD and eaten at McDonald.", 
                "The best burger in McDonald is cheeze buger.",
                "Kevin Lee is planning to watch the Big Bang Theory and eat at KFC."]}

df = pd.DataFrame(data)

# 逐个分类判断是否命中
for label, keywords in entertainment_dict.items():
    keyword_regex = '|'.join(keywords)
    df[label] = df['text'].str.contains(keyword_regex, regex=True)

# 聚合所有命中的标签
df['labels'] = df.apply(lambda row: ','.join([k for k in entertainment_dict.keys() if row[k]]), axis=1)

# 可选:删除中间生成的分类判断列
df = df.drop(columns=entertainment_dict.keys())

输出结果:

text       labels
0  Kevin Lee has bought a Taylor Swift's CD and e...  Music,Food
1       The best burger in McDonald is cheeze buger.         Food
2  Kevin Lee is planning to watch the Big Bang Th...     TV,Food

解决方案2:基于str.extractall实现

如果你希望继续沿用原有正则分组匹配的逻辑,可以改用str.extractall()捕获所有匹配项,再聚合标签,和原有代码兼容性更高:

import pandas as pd

entertainment_dict = {
  "Food": ["McDonald", "Five Guys", "KFC"],
  "Music": ["Taylor Swift", "Jay Z", "One Direction"],
  "TV": ["Big Bang Theory", "Queen of South", "Ted Lasso"]
}

data = {'text':["Kevin Lee has bought a Taylor Swift's CD and eaten at McDonald.", 
                "The best burger in McDonald is cheeze buger.",
                "Kevin Lee is planning to watch the Big Bang Theory and eat at KFC."]}

df = pd.DataFrame(data)
regex = '|'.join(f'(?P<{k}>{"|".join(v)})' for k,v in entertainment_dict.items())

# 提取所有匹配项,按行聚合标签
matches = df['text'].str.extractall(regex).notnull().groupby(level=0).any()
df['labels'] = matches.apply(lambda r: ','.join([k for k in entertainment_dict.keys() if r[k]]), axis=1)

两种方案均支持任意数量的多标签匹配:方案1代码更易懂,适合需要频繁调整分类规则的场景;方案2执行效率更高,适合分类数量多、数据量大的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:18:03