Pandas用pyzipcode映射邮政编码到州时遇下标错误问题排查
错误原因与修正方案
核心错误原因
报错'method' object is not subscriptable的直接原因是这行代码:
df = df.dropna
dropna是pandas DataFrame的方法,必须通过括号()调用才能返回处理后的DataFrame。你现在把方法本身赋值给了df,导致后续df['Zip']试图对一个方法对象做下标操作,自然触发报错。
额外逻辑问题
另外,你写的过滤非数值邮编的代码没有生效:
df[pd.to_numeric(df['Zip'], errors='coerce').notnull()]
这行只是生成了过滤后的DataFrame,但没有重新赋值给df,等于白执行了这一步过滤操作。
修正后的完整代码
from pyzipcode import ZipCodeDatabase import pandas as pd zcdb = ZipCodeDatabase() # 读取数据 df = pd.read_excel(r'G:\Downloads\testzip.xlsx') # 过滤非数值型的邮编行,重新赋值给df df = df[pd.to_numeric(df['Zip'], errors='coerce').notnull()] # 调用dropna方法删除空值行(注意必须加括号) df = df.dropna() # 将Zip转为整数(pyzipcode要求传入整数类型邮编),再映射获取对应州 df['state'] = df['Zip'].astype(int).map(lambda x: zcdb[x].state)
补充说明
如果你的邮编存在带前导零的情况(比如美国的00501),转整数会丢失前导零,这时候需要先把Zip转为字符串,再用zcdb.get()方法查询,同时增加容错避免不存在的邮编报错:
df['state'] = df['Zip'].astype(str).map(lambda x: zcdb.get(x).state if zcdb.get(x) else None)
内容的提问来源于stack exchange,提问作者Possdawgers
相关产品推荐
相关产品推荐

