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

如何在Python Pandas DataFrame中基于词列表添加标记列?

解决Pandas DataFrame中基于词汇列表添加标记列的问题

咱们先梳理下你代码里的几个核心问题,再一步步给出修正方案:

问题分析

  1. 参数类型错误:你第一次调用emb_col_1时直接传了列表words,但str.contains只接受正则表达式字符串,直接传列表会触发报错。
  2. 词汇的空格干扰:你的词汇列表里有' pics '(前后带空格),这会导致只有完全包含带空格的" pics "的条目才会被匹配,像"pics"(无空格)这类正常写法的内容会被漏掉。
  3. 匹配精度问题:直接用|拼接词汇可能会出现部分匹配(比如把"photoshopped"里的"photos"也误判为匹配),如果需要匹配完整单词,得加上正则的单词边界。

修正后的完整解决方案

步骤1:清理词汇并构建正确的正则模式

先去掉词汇里多余的空格,再给每个词汇加上单词边界\b,确保只匹配完整单词:

import pandas as pd
import numpy as np

# 清理词汇列表,去掉不必要的空格
words = ['photos', 'pictures', 'pics', 'pix', 'image']
# 构建带单词边界的正则模式,避免部分匹配
pattern = r'\b(' + '|'.join(words) + r')\b'

步骤2:优化标记列函数

简化逻辑,同时处理大小写不敏感(可选)和空值情况:

def emb_col_1(tr, col, pat, suf):
    # 用np.where实现更简洁的标记逻辑,case=False忽略大小写,na=False把空值标记为0
    tr[f"0_{col}{suf}"] = np.where(tr[col].str.contains(pat, case=False, na=False), 1, 0)

步骤3:测试函数效果

创建包含匹配/不匹配条目的测试数据,验证功能:

# 构造测试DataFrame
train = pd.DataFrame({
    'a': ['photos', 'my pictures', 'a pic', 'pixel art', 'image file', 'random text']
})

# 调用函数添加标记列
emb_col_1(train, 'a', pattern, '_p')

print(train)

运行后输出结果:

a  0_a_p
0        photos      1
1  my pictures      1
2        a pic      0  # 若需要匹配"pic",可把词汇列表改成['pic', 'pics', ...]
3    pixel art      0  # 单词边界确保只匹配完整的"pix",不会误判"pixel"
4   image file      1
5  random text      0

额外调整建议

  • 如果不需要严格匹配完整单词,只需要包含子串,去掉正则里的\b即可,直接用pattern = '|'.join(words)
  • 如果要同时匹配单数/复数(比如"pic"和"pics"),可以把正则改成r'\b(pic(s)?|photos|pictures|pix|image)\b'
  • 如果需要区分大小写,去掉str.contains里的case=False参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:04:38