为何Pandas的df.apply函数执行正则分类时返回None值
问题根源
re.search参数顺序写反
Python标准库re模块的search方法语法要求为:
re.search(pattern, 待匹配的字符串, flags=0)
你自定义函数里把「待匹配的单元格值」和「正则规则」的位置写反了,导致匹配逻辑完全错误:相当于把每个单元格的内容作为正则规则,去匹配固定字符串'microsoft|office|m365|o365',只有单元格内容刚好是这个固定字符串的子串时才会命中,和你的需求完全相反。
2. 次要问题:自定义函数的参数名容易产生误解,df['name'].apply()传入函数的是name列的单个单元格值,不是整列Series,命名为name_str这类语义更清晰。
修复后的apply写法
调整参数顺序,再加空值判断兼容异常值即可正常运行:
import re def category(name_str): # 先处理非字符串/空值情况,避免运行报错 if not isinstance(name_str, str): return 'Not Microsoft 365' pattern = 'microsoft|office|m365|o365' if re.search(pattern, name_str, re.IGNORECASE) is not None: return 'Microsoft 365' else: return 'Not Microsoft 365' df['Category'] = df['name'].apply(category)
补充说明
你后续用str.contains的实现方案更符合Pandas向量化操作习惯,性能比逐行apply更高,更推荐使用。只需要补全默认值赋值和异常处理即可覆盖全部场景:
pattern = 'microsoft|office|m365|o365' df['Category'] = 'Not Microsoft 365' # 先给全部行赋默认值 df.loc[df['name'].str.contains(pattern, case=False, na=False), 'Category'] = 'Microsoft 365'
参数na=False是为了让name列为空的行直接返回False,避免赋值时出现逻辑异常。
内容的提问来源于stack exchange,提问作者yd132
相关产品推荐
相关产品推荐

