You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 23:51:16