使用Lambda处理Pandas列正则提取时出现'NoneType'无'group'属性错误
解决Pandas正则提取时的AttributeError问题
嘿,这个问题我太熟了!当re.search()在你的content列某行里找不到符合@([a-zA-Z0-9]{1,15})的匹配内容时,它会返回None,这时候你直接调用.group(1)就会触发'NoneType' object has no attribute 'group'这个错误。咱们有几个简单的解决办法:
方法1:在lambda里处理None的情况
你可以先判断re.search()的返回值是不是None,再决定要不要提取分组内容:
- 如果你的Python版本是3.8+,可以用海象运算符简化代码:
import re dff['User_Mentions'] = dff['content'].apply(lambda x: match.group(1) if (match := re.search("@([a-zA-Z0-9]{1,15})", x)) else None)
- 要是版本较低,就用嵌套的方式避免重复调用正则:
dff['User_Mentions'] = dff['content'].apply(lambda x: (lambda m: m.group(1) if m else None)(re.search("@([a-zA-Z0-9]{1,15})", x)))
这样没有匹配的行就会被设为None,不会报错。
方法2:用Pandas原生的str.extract()(更推荐)
Pandas专门提供了字符串处理方法,str.extract()会自动处理没有匹配的情况,直接返回NaN,代码更简洁高效:
dff['User_Mentions'] = dff['content'].str.extract("@([a-zA-Z0-9]{1,15})", expand=False)
expand=False会让结果返回Series,刚好适合赋值给新列。
额外排查:看看哪些行没匹配到
如果你想知道为什么有些行没匹配上,可以先找出这些行,检查是不是正则表达式的问题(比如用户名里有下划线?Twitter用户名允许下划线,但你的正则只包含字母数字):
no_match_rows = dff[dff['content'].str.contains("@([a-zA-Z0-9]{1,15})") == False] print(no_match_rows['content'])
要是确实有带下划线的用户名,把正则改成@([a-zA-Z0-9_]{1,15})就好啦。
内容的提问来源于stack exchange,提问作者Bilal Aamer
相关产品推荐
相关产品推荐

