Pandas应用自定义函数报AttributeError: str对象无str属性错误
Pandas自定义apply函数'str'属性错误排查
报错信息
运行DataFrame apply逻辑时抛出异常:
AttributeError: 'str' object has no attribute 'str'
错误原因
- 调用
z2.apply(f_MI, axis=1)时,Pandas会按行遍历数据,将每一行封装为Series传入自定义函数,此时函数内取DF['AccNo']、DF['Map_MainDesc']得到的是单个单元格的Python原生字符串标量,不是整列/整段的Pandas Series对象。 .str是Pandas为Series设计的批量字符串操作访问器,仅能用于Series类型,普通Python字符串没有这个属性,因此触发属性错误。- 第一层判断
DF['AccNo'] == DF['Map_AccNo']未报错,是因为Python原生字符串本身支持相等性判断,执行到第二层.str调用时才触发异常。
修复方案
方案1:适配逐行传参逻辑修改函数
逐行处理时直接调用Python原生字符串方法即可,额外增加str()包裹可以兼容空值、非字符串类型的边界情况:
def f_MI(row): if row['AccNo'] == row['Map_AccNo']: return -1 else: if str(row['AccNo']).lower()[:3] == str(row['Map_MainDesc']).lower()[:3]: return 1 else: return 0 z2['Inter_Type'] = z2.apply(f_MI, axis=1)
方案2:向量化实现(推荐,性能更高)
当数据量较大时,逐行apply的循环效率很低,可以直接对整列使用Pandas内置的.str批量操作,无需写自定义循环逻辑,性能可提升数十倍:
# 初始化默认返回值0 z2['Inter_Type'] = 0 # 识别前3位小写字符匹配的记录,赋值1 prefix_match = z2['AccNo'].str.lower().str[:3] == z2['Map_MainDesc'].str.lower().str[:3] z2.loc[prefix_match, 'Inter_Type'] = 1 # 识别两列完全相等的记录,赋值-1(优先级最高,覆盖之前的赋值) full_equal = z2['AccNo'] == z2['Map_AccNo'] z2.loc[full_equal, 'Inter_Type'] = -1
内容的提问来源于stack exchange,提问作者kpra
相关产品推荐
相关产品推荐

