2016-12-31 29 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