如何在Python Pandas DataFrame中基于词列表添加标记列?
解决Pandas DataFrame中基于词汇列表添加标记列的问题
咱们先梳理下你代码里的几个核心问题,再一步步给出修正方案:
问题分析
- 参数类型错误:你第一次调用
emb_col_1时直接传了列表words,但str.contains只接受正则表达式字符串,直接传列表会触发报错。 - 词汇的空格干扰:你的词汇列表里有
' pics '(前后带空格),这会导致只有完全包含带空格的" pics "的条目才会被匹配,像"pics"(无空格)这类正常写法的内容会被漏掉。 - 匹配精度问题:直接用
|拼接词汇可能会出现部分匹配(比如把"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
相关产品推荐
相关产品推荐

