为何无法用uszipcodes的SearchEngine()获取城市名?
我有一个包含客户邮编的pd.DataFrame,尝试用uszipcodes库的SearchEngine()添加对应城市名的新列,代码如下:
!pip install uszipcode from uszipcode import SearchEngine, SimpleZipcode import numpy as np import pandas as pd data = pd.read_csv(dataset) data['City_Name'] = np.nan search = SearchEngine() for i in data['ZIPCode']: data['City_Name'] = search.by_zipcode(i).city
运行后出现以下错误:
AttributeError Traceback (most recent call last)
Input In [35], in <cell line: 2>()
1 search = SearchEngine()
2 for i in data['ZIPCode']:
3 #city = search.by_zipcode(i).city
4 SearchEngine().by_zipcode(i).cityAttributeError: 'NoneType' object has no attribute 'city'
单独测试city = search.by_zipcode(75024).city可正常运行,排查发现是邮编92717导致报错。删除该行后重新运行,又出现新错误:
--------------------------------------------------------------------------- TypeError Traceback (most recent call
last) Input In [96], in <cell line: 4>()
2 search = SearchEngine()
3 num = 0
----> 4 for i in data['ZIPCode']:
5 data['City_Name'] = search.by_zipcode(i).cityTypeError: 'NoneType' object is not subscriptable
错误原因
- AttributeError:当邮编无效/不存在时,
search.by_zipcode(i)会返回None,此时直接访问.city就会触发错误,因为None没有该属性。 - TypeError:删除报错行后出现的问题,大概率是
ZIPCode列存在空值(NaN),遍历过程中遇到None类型值导致无法迭代。 - 原循环逻辑错误:每次赋值都会覆盖整列的
City_Name,最终只会保留最后一个邮编对应的城市名。
修复后的代码
!pip install uszipcode from uszipcode import SearchEngine import pandas as pd # 读取数据 data = pd.read_csv(dataset) # 初始化SearchEngine实例 search = SearchEngine() def get_city_from_zip(zip_code): # 处理空值情况 if pd.isna(zip_code): return None # 统一转换为字符串,避免整数格式邮编丢失前导零 zip_str = str(int(zip_code)) if isinstance(zip_code, (int, float)) else str(zip_code).strip() # 查询邮编,判断返回结果是否有效 zip_result = search.by_zipcode(zip_str) return zip_result.city if zip_result else None # 使用apply批量生成城市名列,避免循环覆盖问题 data['City_Name'] = data['ZIPCode'].apply(get_city_from_zip)
关键优化点
- 用
apply替代循环,避免整列赋值覆盖的低级错误。 - 增加空值判断,处理
ZIPCode列的缺失值。 - 统一邮编为字符串格式,防止前导零丢失(如00123这类特殊邮编)。
- 对查询结果做有效性校验,避免
None对象访问属性的错误。
内容的提问来源于stack exchange,提问作者Anish Indukur

