Pandas遍历DataFrame请求API取经纬度仅返回最后一行数据如何解决
错误原因
- 数据库连接变量笔误:你定义的数据库连接对象是
con_db,后续创建游标时调用了con.cursor(),con属于未定义变量,运行会直接报错。 - URL拼接重复:你已经提前通过
df['url_api'] = url_api + df['zip_code']生成了完整的请求地址,循环中又重复拼接了一次API前缀,实际请求的地址格式错误,无法正常拿到返回数据。 - 列赋值逻辑错误:循环内写
df['coord'] = xxx是对整个coord列统一赋值,每次循环都会覆盖所有行的该字段值,最终所有行都会保留最后一次循环的赋值结果,就是你看到的所有行经纬度完全相同的问题。
修正后代码
import json import pandas as pd import psycopg2 import urllib.request import requests # 修正连接变量名不一致问题 con = psycopg2.connect(host='', database='', user='', password='') cursor = con.cursor() cursor.execute("SELECT * FROM table WHERE district = 'Monjolos' limit 10") result = cursor.fetchall() df = pd.DataFrame(result) df.columns = [columns[0] for columns in cursor.description] url_api = 'https://cep.awesomeapi.com.br/json/' df['url_api'] = url_api + df['zip_code'] for index, row in df.iterrows(): # 直接用已经生成的完整url,不需要重复拼接前缀 open_json = urllib.request.urlopen(row['url_api']) data = json.loads(open_json.read()) # 只给当前行的coord字段赋值 df.loc[index, 'coord'] = data['lat'] + ', ' + data['lng'] print(df[['id', 'url_api', 'coord']])
可选优化方案
你可以用apply方法替代iterrows遍历,代码更简洁,运行效率也更高:
def get_coord(url): open_json = urllib.request.urlopen(url) data = json.loads(open_json.read()) return f"{data['lat']}, {data['lng']}" df['coord'] = df['url_api'].apply(get_coord)
内容的提问来源于stack exchange,提问作者Lino Costa
相关产品推荐
相关产品推荐

