2016-12-31 27 views
0

我想从Mapzen中检索德国地址的地理数据(long/lat)。 Mapzen提供了一个要求输入密钥的API。每个请求都返回一个Json。将DataFrame填入for循环中,涉及函数的Python

这下面的代码返回长/ lat和地址名称地址:

import pandas as pd 
import request 

BASE_URL = 'https://search.mapzen.com/v1/search' 
txt = 'Stübekamp 33, Hamburg, Germany' 
resp = requests.get(BASE_URL, params = {'api_key': "YourKey", 'size': 1, 'text': txt}) 
data = resp.json() 
Full = pd.DataFrame(columns=["Long", "Lat", "Street"]) 
LongLat = data["bbox"][0:2] 
Street = data["features"][0]["properties"]["label"] 
Full.loc[1] = pd.Series({"Long": LongLat[1], "Lat": LongLat[0], "Street": Street}) 

我尝试过它来代替TXT参数循环,但只要我的理解方法request.GET中不能被循环。因此,我遵循this的方法并定义了一个我在for循环中使用的函数。

我想让for循环做的是将一行的字符串粘贴到函数中txt参数的地址中。这应该做n次,而n是地址向量的长度。检索到的信息(长/纬/地址)应该添加到AllAddresses DataFrame中的新行。所以最后我有一个DataFrame有三列(“长”,“拉特”,“街”),在这种情况下3行。

def Getall(Input): 
    resp = requests.get('https://search.mapzen.com/v1/search', params = {'api_key': "YourKey", 'size': 1, 'text': Input}) 
    data = resp.json() 
    LongLat = data["bbox"][0:2] 
    Street = data["features"][0]["properties"]["label"] 
    Full = pd.DataFrame(columns=["Long", "Lat", "Street"]) 
    Full.loc[1] = pd.Series({"Long": LongLat[1], "Lat": LongLat[0], "Street": Street}) 

    return Full 


addresses = pd.DataFrame(["Stübekamp 33, Hamburg, Germany", "Mesterfeld 28, Hamburg, Germany","Beutnerring 2, Hamburg, Germany"]) 


AllAddresses = [] 
for index, row in addresses.iterrows(): 
    Input = row("0") 
    data = Getall(Input) 
    AllAddresses.append = data 

但是这个代码,则返回错误:

TypeError: 'Series' object is not callable 

,我读了iterrows是要走的路,但我来自R到来,觉得有点丢在这里。

回答

1

地址是一个没有明显原因的熊猫数据框。然后你迭代它,如果你需要一个你不需要的熊猫数据框,这通常是一个坏主意。然后你将“row”作为一个系列,并称之为一个函数行(“0”)。由于这不是一个函数,你会得到一个错误。只需将地址列入清单即可解决您的第一个问题。

那么当然你会发现你有一个Full的问题,它也不需要是一个数据框;你不能像这样添加一行;并且你正在为每行返回一个数据框,这可能不是你想要的。

+0

我现在看到我的问题。我太专注于熊猫数据框。谢谢! – CFM