我使用pandas在Python中有一个数据框。它有2列名为' dropoff_latitude'和' pickup_latitude'。我想创建一个函数,根据这两个变量创建第3列(通过api运行它们)。
所以我写了一个函数:
def dropoff_info(row):
dropoff_latitude = row['dropoff_latitude']
dropoff_longitude = row['dropoff_longitude']
dropoff_url2 = "http://data.fcc.gov/api/block/find?format=json&latitude=%s&longitude=%s&showall=true" %(dropoff_latitude,dropoff_longitude)
dropoff_resp2 = requests.get(dropoff_url2)
dropoff_results2 = json.loads(dropoff_resp2.text)
dropoffinfo = dropoff_results2["Block"]["FIPS"][2:11]
return dropoffinfo
然后我会把它当作 df [' newcolumn'] = dropoffinfo(df)
但它不起作用。
在排除故障后,我发现当我打印dropoff_latitude时,它看起来像这样:
0 40.773345947265625
1 40.762149810791016
2 40.770393371582031
...
所以我认为URL无法生成。我希望dropoff_latitude在打印时看起来像这样:
40.773345947265625
40.762149810791016
40.770393371582031
...
而且我不知道如何指定我只想要实际的内容部分。
当我尝试
时dropoff_latitude = row['dropoff_latitude'][1]
dropoff_longitude = row['dropoff_longitude'][1]
它只是给了我第一排的值,所以显然没有用。
想法好吗?我对使用数据帧非常陌生......谢谢!
答案 0 :(得分:0)
Alex - 对于pandas,我们通常喜欢避免循环,但在您的特定情况下,需要ping远程服务器以获取数据非常需要它。所以我做了以下的事情:
l = []
for i in df.index:
dropoff_latitude = df.loc[i, 'dropoff_latitude']
dropoff_longitude = df.loc[i, 'dropoff_longitude']
dropoff_url2 = "http://data.fcc.gov/api/block/find?format=json&latitude=%s&longitude=%s&showall=true" %(dropoff_latitude,dropoff_longitude)
dropoff_resp2 = requests.get(dropoff_url2)
dropoff_results2 = json.loads(dropoff_resp2.text)
l.append(dropoff_results2["Block"]["FIPS"][2:11])
df['new'] = l
此处的关键是.loc[i, ...]
位,使您能够逐个遍历每一行,并调出相关列以创建要发送到API的变量。
关于你的记忆消耗的问题 - 这比我的工资等级略高,但在这种情况下,我真的不认为你有任何其他选择(除非你的API有某种批量请求,允许您在一次调用中提取更大的数据集。)