基于另一列关键词为DataFrame新增分类列的问题
解决方法
报错原因
你遇到的'str' object has no attribute 'str'错误,是因为row['name']是单个字符串值,而.str是pandas Series/Index专属的字符串访问器,单个字符串对象没有这个属性,所以不能这么用。
推荐方案(适合大型DataFrame,效率优先)
直接对name列做矢量化字符串匹配,这是pandas处理大数据量的最优方式,比apply快得多:
import numpy as np # 定义关键词列表 climate = ['environment', 'climate', 'global warming'] # 拼接成正则匹配模式 pattern = '|'.join(climate) # 新增sub_category列,匹配成功赋值'Climate',否则设为None(或你需要的默认值) df['sub_category'] = np.where( df['name'].str.contains(pattern, case=False), 'Climate', None # 这里可以替换成其他默认分类,比如'Other' )
如果需要匹配完整单词(避免类似environmental这类衍生词被误判),可以调整正则模式:
# 匹配完整单词的正则规则 pattern = r'\b(' + '|'.join(climate) + r')\b' df['sub_category'] = np.where(df['name'].str.contains(pattern, case=False), 'Climate', None)
如果你一定要用apply(适合复杂多分类逻辑)
修改函数,直接对单个字符串做匹配,不用.str访问器:
方法1:正则匹配
import re climate = ['environment', 'climate', 'global warming'] # 预编译正则,提升循环匹配效率 pattern = re.compile('|'.join(climate), re.IGNORECASE) def sub_cat(row): if pattern.search(row['name']): return 'Climate' # 这里可以添加其他分类的判断逻辑 return None df['sub_category'] = df.apply(sub_cat, axis=1)
方法2:关键词包含检查
climate = ['environment', 'climate', 'global warming'] def sub_cat(row): name_lower = row['name'].lower() for keyword in climate: if keyword in name_lower: return 'Climate' return None df['sub_category'] = df.apply(sub_cat, axis=1)
内容的提问来源于stack exchange,提问作者Emmett C
相关产品推荐
相关产品推荐

