将从地址到经度和纬度的地理编码结果保存到Python中的原始数据帧



给定一个小数据集df如下:

id             name address
0   1        ABC tower  北京市朝阳区
1   2          AC park  北京市海淀区
2   3      ZR hospital  上海市黄浦区
3   4  Fengtai library     NaN
4   5     Square Point  上海市虹口区

我想获得address列的经度纬度,并将它们附加到原始数据帧中。请注意,address列中有NaN

下面的代码给了我一个包含地址、经度和纬度的表,但它忽略了NaN地址行,代码也应该改进:

import pandas as pd
import requests
import json
df = df[df['address'].notna()]
res = []
for addre in df['address']:
url = "http://restapi.amap.com/v3/geocode/geo?key=f057101329c0200f170be166d9b023a1&address=" + addre
dat = {
'count': "1",
}
r = requests.post(url, data = json.dumps(dat))
s = r.json()
infos = s['geocodes']
for j in range(0, 10000):
# print(j)
try:
more_infos = infos[j]
# print(more_infos)
except:
continue
try:
data = more_infos['location']
# print(data)
except:
continue
try:
lon_lat = data.split(',')
lon = float(lon_lat[0])
lat = float(lon_lat[1])
except:
continue
res.append([addre, lon, lat])
result = pd.DataFrame(res)
result.columns = ['address', 'longitude', 'latitude']
print(result)
result.to_excel('result.xlsx', index = False)

输出:

address   longitude   latitude
0  北京市朝阳区  116.601144  39.948574
1  北京市海淀区  116.329519  39.972134
2  上海市黄浦区  121.469240  31.229860
3  上海市虹口区  121.505133  31.264600

但是我怎么能得到如下的最终结果呢?感谢您提前提供的帮助。

id             name address   longitude   latitude
0   1        ABC tower  北京市朝阳区  116.601144  39.948574
1   2          AC park  北京市海淀区  116.329519  39.972134
2   3      ZR hospital  上海市黄浦区  121.469240  31.229860
3   4  Fengtai library     NaN         NaN        NaN
4   5     Square Point  上海市虹口区  121.505133  31.264600

使用pd.merge,因为result是经度&纬度数据帧。

dfn = pd.merge(df, result, on='address', how='left')

for _, row in df.iterrows():
_id = row['id']
name = row['name']
addre = row['address']

if pd.isna(row['address']):
res.append([_id, name, addre, None, None])
continue
###### same code  ######
url = '...'
# ...
###### same code  ######
res.append([_id, name, addre, lon, lat])
result = pd.DataFrame(res)
result.columns = ['id', 'name', 'address', 'longitude', 'latitude']
print(result)
result.to_excel('result.xlsx', index = False)  

最新更新