Pandas apply调用自定义正则函数无效果的问题及解决方案
Pandas apply调用自定义正则函数无生效问题排查
问题场景
自定义正则匹配函数在独立传入字符串测试时运行正常,但对DataFrame直接调用apply时仅返回原始单元格值,无法得到正则捕获结果。因业务需要处理大型DataFrame,iterrows、itertuples等遍历方法性能不足,必须使用apply类方案。
相关代码
自定义正则匹配函数
import re def match_pattern(df_cell): if type(df_cell) == str: result = re.search(r'(?:[0-9]{1,4}\s)(.*)(?=\nName)', df_cell) if result: print('result.group(1)',result.group(1)) return result.group(1) else: print('no result') return df_cell else: return df_cell
单测验证(运行正常)
string = '3971 Small Arms Survey\nName' string2 = 'nothing here' match_pattern(string) # 输出预期结果'Small Arms Survey' match_pattern(string2) # 输出原字符串'nothing here'
错误调用写法(无预期效果)
import pandas as pd frame = pd.DataFrame(['3971 Small Arms Survey\nName']) frame2 = frame.apply(lambda x: match_pattern(str(x))) frame2 # 输出原字符串'3971 Small Arms Survey\nName'
调试时可以观察到print('result.group(1)',result.group(1))会正常触发,但最终返回的仍是原始单元格值。
问题根因
直接对整个DataFrame调用apply时,传入函数的参数是整列的Series对象,而非单个单元格的字符串值,即使额外做了str转换也无法得到正确的单元格内容,导致返回结果无法正确生效。
解决方法
如果只需要处理指定列,直接对单列调用apply即可:
frame = frame[0].apply(match_pattern) # 单元格输出预期结果'Small Arms Survey'
如果需要对全表所有单元格应用该规则,可以使用针对单元格级别的applymap方法:
frame = frame.applymap(match_pattern)
内容的提问来源于stack exchange,提问作者jackewiebohne
相关产品推荐
相关产品推荐

