列表推导式处理记账数据时出现'NoneType'无group属性报错原因求解
问题根源解析
1. 为什么if item is not None没有过滤掉报错项
你写的过滤条件仅判断了Memo列的取值本身是否为None,没有覆盖「Memo有值但正则匹配失败」的场景:只要Memo内容中不存在符合\b[a-zA-Z]{3,}\b规则的子串,re.search就会返回None,此时直接调用.group(0)必然触发属性不存在的报错。
2. 为什么去掉.group(0)就不报错
去掉属性调用后,列表会同时存储匹配成功的re.Match对象、匹配失败的None值,两种类型都可以直接存入列表,不会触发调用错误;但只要你加上.group(0),就会命中匹配失败返回None的场景,触发报错。
列表推导式正确实现
Python 3.8及以上版本可以用海象运算符暂存匹配结果,无需额外捕获异常:
import re df['Suppliers'] = [ match.group(0).lower() if (match := re.search(r'\b[a-zA-Z]{3,}\b', item)) else 'na' for item in df['Memo'] if item is not None ]
注:你原有循环实现里,把
df['Suppliers'] = pd.DataFrame({'Suppliers': my_list})放在循环体内是冗余操作,会重复给DataFrame赋值,建议等my_list完全生成后再一次性赋值。
内容的提问来源于stack exchange,提问作者user6009994
相关产品推荐
相关产品推荐

