使用涉及函数的Python在for循环中填充DataFrame

时间:2016-12-31 11:40:36

标签: python-3.x for-loop request

我想从Mapzen检索德国地址的地理数据(long / lat)。 Mapzen提供了一个要求密钥的API。每个请求都返回一个Json。

以下代码返回一个地址的长/纬度和地址名称:

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有三个列(" Long"," Lat"," Street"),在这种情况下是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 个答案:

答案 0 :(得分:1)

地址是一个大熊猫数据框,没有明显的原因。然后你迭代它,这通常是一个坏主意,如果你需要一个你不需要的熊猫数据框架。然后你采取" row"这是一个系列,并将其称为函数行(" 0")。由于它不是一个功能,你会收到错误。只需将地址设为列表即可解决您的第一个问题。

当然,你会发现你有Full的问题,也不需要是数据帧;你不能添加这样的行;并且您将返回每行的数据帧,这可能不是您想要的。