报错AttributeError: 'int'对象无split属性的排查(DataFrame场景)
问题排查与解决方法
一、报错原因分析
尽管ADDRESS列整体数据类型显示为object,但列内部混入了整数(int)类型的元素。object类型列允许存储多种数据类型(字符串、整数等),因此即使列类型是object,仍可能存在无法调用split()方法的int值,从而触发报错。
二、排查验证步骤
先确认列中是否存在非字符串类型元素:
# 筛选出ADDRESS列中类型不是字符串的行 non_str_rows = df[df['ADDRESS'].apply(lambda x: not isinstance(x, str))] print(non_str_rows) # 统计列内各数据类型的分布 type_counts = df['ADDRESS'].apply(type).value_counts() print(type_counts)
三、解决方案
方法1:强制统一转为字符串
先将列内所有元素转为字符串,消除类型差异:
import numpy as np # 强制转换ADDRESS列为字符串类型 df['ADDRESS'] = df['ADDRESS'].astype(str) # 再执行州名提取逻辑 df["STATE"] = df["ADDRESS"].map(lambda x: state if (state := x.split()[-1]) in state_lists else np.nan)
注:若原int值为无效地址(如0、空值转换后的整数),转字符串后可后续单独过滤。
方法2:处理时先判断元素类型
在lambda表达式中先校验类型,避免对int执行split操作:
import numpy as np df["STATE"] = df["ADDRESS"].map(lambda x: state if isinstance(x, str) and (state := x.split()[-1]) in state_lists else np.nan)
方法3:正则匹配州名(更可靠)
仅取地址最后一个词的逻辑易出错(比如最后是邮编),用正则匹配州名更精准:
import re import numpy as np # 生成匹配州名的正则(匹配完整单词,忽略大小写) state_pattern = re.compile(r'\b(' + '|'.join(re.escape(s) for s in state_lists) + r')\b', flags=re.IGNORECASE) def extract_state(address): if not isinstance(address, str): return np.nan match = state_pattern.search(address) return match.group(1) if match else np.nan df["STATE"] = df["ADDRESS"].apply(extract_state)
内容的提问来源于stack exchange,提问作者Engr. Chinwe
相关产品推荐
相关产品推荐

