首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在数据框架中循环的SmartyStreets API

在数据框架中循环的SmartyStreets API
EN

Stack Overflow用户
提问于 2020-01-08 18:17:41
回答 1查看 407关注 0票数 3

我对Python相当陌生,并且正在使用SmartyStreets API。我试图读取一个包含地址的数据框架,并简单地验证它们。然而,我遇到了一些问题,并没有产生任何结果。下面的代码应该简单地输出数据帧中每一行的打印语句。

我希望函数从包含正确信息的数据框架中的列中获取其变量的名称。

例如:当读取数据时,函数应该从Street1列中获取其地址变量。同样,City应该来自City列,State来自state,zipcode来自Zipcode。

因此,对于第一次迭代,函数应该将变量存储如下:

代码语言:javascript
复制
lookup.street = '1600 Amphitheatre Pkwy'
lookup.city = 'Mountain view"
lookup.state = 'CA'
lookup.zip = '94043'

最终目标将是从API中将一个县列添加到每一行的末尾,并使用适当的县。但是,我无法让它在没有错误的情况下运行。任何援助都是有帮助的。如果需要,您可以从SmartyStreets网站获得每月250个呼叫的免费API密钥。我所包含的代码来自于github上的示例。这可能不是最有效的方法,如果您有一种更有效的方法来编写这个代码,请随意将它包含在您的响应中。下面显示了所使用的代码和发现的错误。

代码语言:javascript
复制
import pandas as pd
from smartystreets_python_sdk import StaticCredentials, exceptions, ClientBuilder
from smartystreets_python_sdk.us_street import Lookup as StreetLookup

##Defines Dictionary
dict = {'Street1': ["1600 Amphitheatre Pkwy", "1 Infinite Loop", "1 Rosedale"],
        'City': ['Mountain view', 'Cupertino', 'Baltimore'],
        'State': ['CA', 'CA', 'MD'],
        'Zipcode': ['94043', '95014', '21237']}
##Converts Dictionary to Data Frame
df = pd.DataFrame(dict)

##Defines Function
def run(address = '', city = '', state = '', zipcode = ''):
    
    auth_id = 'ID HERE'
    auth_token = 'TOKEN HERE'
    
    credentials = StaticCredentials(auth_id, auth_token)
    
    client = ClientBuilder(credentials).build_us_street_api_client()
    
        
    lookup = StreetLookup()
    #lookup.input_id = '' ##Optional ID from your system
    #lookup.addressee = addressee
    lookup.street = address
    ##lookup.street2 = address2
    #lookup.secondary = secondary ##STE, Apartment, etc.
    #lookup.urbanization = '' ##PR Addresses ONLY
    lookup.city = city
    lookup.state = state
    lookup.zipcode = zipcode
    lookup.candidates = 1
    lookup.match = 'Invalid'

    try:
        client.send_lookup(lookup)
    except exceptions.SmartyException as err:
        print(err)
        return

    result = lookup.result

    if not result:
        print("No candidates. This means the address is not valid.")
        return

    first_candidate = result[0]

    print("Address is valid. (There is at least one candidate)\n")
    print("ZIP Code: " + first_candidate.components.zipcode)
    print("County: " + first_candidate.metadata.county_name)

    for c, candidate in enumerate(lookup.result):
        print("- {}: {}, {}, {}".format(c, candidate.delivery_line_1, candidate.last_line, candidate.metadata.county_name))

##Runs function     
df.apply(run(address = 'Street1',  city = 'City', state = 'State', zipcode = 'Zipcode'))

当它运行时,我会得到以下错误:

TypeError:("'NoneType‘对象不可调用“,’发生在索引Steet1')

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-08 18:43:30

据我所知,有几个问题。首先,您是字典中的第一列“Steet1”,但应该是“Street1 1”。第二,我认为这是不正确的用法。如果你想做这样的事情,我建议做以下修改。

代码语言:javascript
复制
def run(row):
    address = row['Street1']
    city = row['City']
    state = row['State']
    zipcode = row['Zipcode']
    ...
df.apply(run, axis = 1)

试试看,如果这能解决问题,请告诉我。此外,由于您只是使用函数run打印东西,所以您可以使用for循环循环并调用函数,所以不一定需要使用apply,但这说明它仍然可以工作。

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

https://stackoverflow.com/questions/59651667

复制
相关文章

相似问题

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