Pandas问题:str.contains多匹配时新增列报ValueError的解决方法
解决评论特征词匹配新列的长度不匹配报错
问题背景
现有包含942条评论的reviews列,特征词列表如下:
features = ['support','time','follow','submit','ticket','team','swap','account','experi','contact','user','platform','screen','servic','custom','restrict','fast','portfolio','specialist']
需求是检查每条评论是否包含特征词中的一个或多个,并将匹配到的词存入新列。原执行代码:
data["words"] = data[data["reviews"].str.contains('|'.join(features))]
报错:ValueError: Columns must be same length as key
报错原因
原代码通过布尔索引data[data["reviews"].str.contains(...)]筛选出了匹配特征词的行子集,这个子集的行数远小于原数据集的942行,直接赋值给新列时,长度不匹配导致报错。
解决方案
使用str.findall()方法,对每一行评论提取所有匹配的特征词,返回结果的长度和原数据集完全一致,不会出现长度不匹配问题。
代码实现
import re features = ['support','time','follow','submit','ticket','team','swap','account','experi','contact','user','platform','screen','servic','custom','restrict','fast','portfolio','specialist'] # 提取所有匹配的特征词,返回列表(无匹配则为空列表) data["words"] = data["reviews"].str.findall(r'\b(' + '|'.join(features) + r')\b', flags=re.IGNORECASE) # 可选:将列表转为逗号分隔的字符串格式 data["words_str"] = data["words"].apply(lambda x: ', '.join(x) if x else '')
代码说明
\b单词边界:确保匹配的是独立单词(比如避免把"service"中的"servic"误匹配,若需求是匹配子串,可去掉\b)。flags=re.IGNORECASE:忽略大小写匹配,比如"Support"或"SUPPORT"都会被识别为"support",不需要可删除此参数。- 处理无匹配情况:无匹配特征词的行,
findall会返回空列表;若需要转为空字符串,用apply方法处理即可。
内容的提问来源于stack exchange,提问作者MASTERWM
相关产品推荐
相关产品推荐

