我用的是Python3,有一个熊猫df,看起来像
zip
0 07105
1 00000
2 07030
3 07032
4 07032我想使用python包uszipcode添加状态和城市。
import uszipcode
search = SearchEngine(simple_zipcode=False)
def zco(x):
print(search.by_zipcode(x)['City'])
df['City'] = df[['zip']].fillna(0).astype(int).apply(zco)但是,我得到以下错误
TypeError: 'Zipcode' object is not subscriptable有人能帮上忙吗?提前谢谢你。
发布于 2019-03-05 23:00:28
调用search.by_zipcode(x)返回一个实例,而不是字典,因此对该对象应用['City']失败。
相反,可以使用较短别名的.major_city属性属性;您希望返回该值,而不是打印它:
def zco(x):
return search.by_zipcode(x).city如果要使用uszipcode项目将邮政编码映射到州和城市名称,则不需要使用完整的数据库(450 If下载)。只需保留“简单”版本(仅为9MB ),将simple_zipcode=False参数省略到SearchEngine()中即可。
接下来,这会非常慢。.apply()在幕后使用一个简单的循环,对于每一行,.by_zipcode()方法将使用SQLAlchemy查询SQLite数据库,创建一个包含匹配行中所有列的单一结果对象,然后返回该对象,这样您就可以从它们获得一个单一属性。
使用Pandas SQL方法直接查询数据库会好得多。uszipcode包在这里仍然很有用,因为它负责为您下载数据库并创建SQLAlchemy会话,属性允许您直接访问它,但从这里开始,我只需要这样做:
from uszipcode import SearchEngine, SimpleZipcode
search = SearchEngine()
query = (
search.ses.query(
SimpleZipcode.zipcode.label('zip'),
SimpleZipcode.major_city.label('city'),
SimpleZipcode.state.label('state'),
).filter(
SimpleZipcode.zipcode.in_(df['zip'].dropna().unique())
)
).selectable
zipcode_df = pd.read_sql_query(query, search.ses.connection(), index_col='zip')若要创建,请使用映射到城市和州列的所有唯一邮政编码。然后你可以使用zipcode dataframe连接您的数据
df = pd.merge(df, zipcode_df, how='left', left_on='zip', right_index=True)这会将city和state列添加到原始数据your中。如果需要输入更多列,请将它们添加到search.ses.query(...)部分,使用.label()在输出数据中为它们提供一个合适的列名(如果没有.label(),它们将以simple_zipcode_或zipcode_作为前缀,这取决于您使用的类)。从模型属性文档化中选择,但是要考虑到如果您需要访问模型属性,您需要使用SearchEngine(simple_zipcode=False)来确保您可以使用完整的450 in数据集,然后在查询中使用Zipcode.<column>.label(...)而不是SimpleZipcode.<column>.label(...)。
将邮政编码作为zipcode_df数据row中的索引,这将比单独在每一行上使用SQLAlchemy快得多(zippier:-)。
https://stackoverflow.com/questions/55011880
复制相似问题