Pandas中.str.contains与in关键字字符串匹配速度及报错问题咨询
问题原因&速度对比解答
报错原因
你遇到的'str' object has no attribute 'str'报错本质是调用对象类型不匹配:
- 单独执行
df["Short description"].str.contains("e")时,调用方是pandas的Series类型,.str是Series专属的字符串处理访问器,所以可以正常运行。 - 用
apply(axis=1)调用自定义函数时,传入conditions函数的是每行的单个字段值,属于Python原生str类型,没有.str属性,自然会报错。
两种匹配方式的速度对比
分两种场景判断:
- 全列批量操作场景:
Series.str.contains远快于逐行in判断。pandas的字符串方法底层是向量化的C优化实现,没有Python级别的循环开销,数据量越大,优势越明显。 - 逐行判断场景(也就是你当前在自定义函数里的使用场景):
"e" in 字符串速度更快。原生Python的字符串in操作本身就是底层C实现的子串匹配,没有pandas对象的封装开销,如果你非要对单个字符串用pd.Series(字符串).str.contains("e")来实现相同逻辑,额外的对象创建、方法调用开销会比直接用in慢数倍。
更优的性能优化方案
你当前有数百个if-else判断,用swifter.apply本质还是走逐行Python循环,性能上限很低。更推荐你把逻辑改成向量化批量判断,用numpy.select或者pandas 1.4+新增的case_when实现,示例如下:
import numpy as np # 按优先级排列所有判断条件 cond_list = [ df2["Short description"].str.contains("e"), df2["Short description"].str.contains("关键词2"), # 剩下的数百个条件按顺序补充 ] # 每个条件对应的返回值 res_list = [ "返回值1", "返回值2", # 对应条件的返回值按顺序补充 ] # 批量生成结果列 df2["Deversement Service"] = np.select(cond_list, res_list, default="默认值")
这种写法完全避免了Python级别的逐行循环,性能比apply写法高几十到上百倍,尤其适合万行以上的数据集。
内容的提问来源于stack exchange,提问作者SRP
相关产品推荐
相关产品推荐

