#python #python-3.x #pandas #dataframe
#питон #python-3.x #панды #фрейм данных
Вопрос:
Учитывая небольшой набор 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
столбца и добавить их в исходный фрейм данных. Пожалуйста, обратите NaN
внимание, что в столбце есть буквы s address
.
Приведенный ниже код дает мне таблицу с адресами, долготой и широтой, но он игнорирует строки 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=f057101329c0200f170be166d9b023a1amp;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
Ответ №1:
используйте 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)
Комментарии:
1. Я так не думаю, поскольку
address
могут быть дублированные элементы.2. как насчет drop_duplicates сначала для результата?
df_address = result.drop_duplicates('address')
3. Ваше второе решение — это то, что я ищу, большое спасибо.