首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeError:“Zipcode”对象不可订阅

TypeError:“Zipcode”对象不可订阅
EN

Stack Overflow用户
提问于 2019-03-05 21:28:49
回答 1查看 1.3K关注 0票数 0

我用的是Python3,有一个熊猫df,看起来像

代码语言:javascript
复制
    zip
0   07105
1   00000
2   07030
3   07032
4   07032

我想使用python包uszipcode添加状态和城市。

代码语言:javascript
复制
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)

但是,我得到以下错误

代码语言:javascript
复制
TypeError: 'Zipcode' object is not subscriptable

有人能帮上忙吗?提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-05 23:00:28

调用search.by_zipcode(x)返回一个实例,而不是字典,因此对该对象应用['City']失败。

相反,可以使用较短别名的.major_city属性属性;您希望返回该值,而不是打印它:

代码语言:javascript
复制
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会话,属性允许您直接访问它,但从这里开始,我只需要这样做:

代码语言:javascript
复制
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连接您的数据

代码语言:javascript
复制
df = pd.merge(df, zipcode_df, how='left', left_on='zip', right_index=True)

这会将citystate列添加到原始数据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:-)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55011880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档