pandas DataFrame循环匹配列表值新增列出现AttributeError报错问题
问题原因分析
- 遍历逻辑错误:
for row in df.iloc[:,3:10]这种写法遍历出来的是列名字符串,不是每行的内容,所以调用.str方法直接报错,这是AttributeError的直接诱因。 - 变量使用错误:首先不要用Python内置关键字
list作为变量名,会覆盖内置功能;其次你的代码里循环关键词时一会用list一会用birds,变量名不一致也会引发报错。 - 赋值逻辑错误:
df['sort'] == i是相等判断语句,不是赋值操作,就算遍历逻辑对也不会给新列写入值,另外你报错代码里写的df['soort']属于拼写错误,和需求的sort列名不一致。 - 匹配逻辑漏洞:没有考虑大小写匹配问题,你的数据里存在
Bird、Birdstrike等首字母大写的内容,默认大小写敏感的str.contains会匹配不到小写的bird关键词。
解决方案
两种实现方式,大数据量场景优先选第二种向量化操作:
方法1:逐行匹配(逻辑易懂,适合小数据量)
import pandas as pd # 匹配关键词列表,不要用list做变量名 match_list = ['bird', 'rabit', 'rat', 'bat'] def get_match(row): # 遍历当前行指定列的所有内容 for text in row.astype(str): for keyword in match_list: # 大小写不敏感匹配 if keyword.lower() in text.lower(): return keyword return None # 应用函数生成新列 df['sort'] = df.iloc[:,3:10].apply(get_match, axis=1)
方法2:向量化操作(执行效率更高)
match_list = ['bird', 'rabit', 'rat', 'bat'] # 把指定列的每行内容拼接成单个字符串,统一转小写 merged_text = df.iloc[:,3:10].fillna('').astype(str).agg(' '.join, axis=1).str.lower() df['sort'] = None # 逐个关键词匹配赋值 for keyword in match_list: df.loc[merged_text.str.contains(keyword, case=False, na=False), 'sort'] = keyword
内容的提问来源于stack exchange,提问作者RM swiftie
相关产品推荐
相关产品推荐

