我有以下数据框并使用了来自 here
的代码from geopy.geocoders import Nominatim
data = {'lat1': [116.51172,116.51135,116.51135,116.51627,116.47186],
'lon1': [39.92123,39.93883,39.93883,39.91034,39.91248]}
# Create DataFrame
df_test = pd.DataFrame(data)
geolocator = Nominatim(user_agent="geoapiExercises")
location = geolocator.reverse(df_test['lat']+","+ df_test['lon'], language='en')
address = location.raw['address']
df_test['suburb']= address.get('suburb', '')
df_test['postcode']= address.get('postcode', '')
df_test['road']= address.get('road', '')
我想从该位置获取 3 个特征,但是出现错误
<块引用>ufunc 'add' 不包含具有签名匹配类型 (dtype(' 你能帮忙获取必要的信息吗?
答案 0 :(得分:0)
使用 pd.apply 将 geolocator.reverse
函数应用于数据框的每一行。
geopy
给出了 latitude coordinates must be in the range [-90, 90] 的错误,所以我添加了纬度和经度标准化
import pandas as pd
from geopy.geocoders import Nominatim
from math import sin, asin, fmod, pi
geolocator = Nominatim(user_agent="geoapiExercises")
data = {'lat1': [116.51172,116.51135,116.51135,116.51627,116.47186],
'lon1': [39.92123,39.93883,39.93883,39.91034,39.91248]}
# Create DataFrame
df = pd.DataFrame(data)
# latitude and longitude normalization according to formulas found at
# https://stackoverflow.com/a/31119445/50065
df['lat'] = df['lat1'].apply(lambda lat: asin(sin((lat/180.0)*pi)) * (180.0/pi))
df['lon'] = df['lon1'].apply(lambda lon: fmod(lon - 180.0, 360.0) + 180.0)
df['lat_lon'] = df['lat'].astype(str) + ',' + df['lon'].astype(str)
df['location'] = df['lat_lon'].apply(lambda lat_lon: geolocator.reverse(lat_lon, language='en'))
df['address'] = df['location'].apply(lambda loc: loc.raw['address'])
df['postcode'] = df['address'].apply(lambda addr: addr.get('postcode', 'no postcode'))
输出:
lat1 | lon1 | lat | lon | lat_lon | 位置 | 地址 | 邮政编码 | |
---|---|---|---|---|---|---|---|---|
0 | 116.512 | 39.9212 | 63.4883 | 39.9212 | 63.488280000000024,39.92123000000001 | Обозерское городское поселение, 普列谢茨基区, 阿尔汉格尔斯克州, 西北联邦区, 164254, 俄罗斯 | {'municipality': 'Обозерское городское поселение', 'county': 'Plesetsky District', 'state': 'Arkhangelsk Oblast', 'region': 'Northwestern Federal District' ', 'postcode': '164254', 'country': '俄罗斯', 'country_code': 'ru'} | 164254 |
1 | 116.511 | 39.9388 | 63.4887 | 39.9388 | 63.488650000000014,39.938829999999996 | Обозерское городское поселение, 普列谢茨基区, 阿尔汉格尔斯克州, 西北联邦区, 164254, 俄罗斯 | {'municipality': 'Обозерское городское поселение', 'county': 'Plesetsky District', 'state': 'Arkhangelsk Oblast', 'region': 'Northwestern Federal District' ', 'postcode': '164254', 'country': '俄罗斯', 'country_code': 'ru'} | 164254 |
2 | 116.511 | 39.9388 | 63.4887 | 39.9388 | 63.488650000000014,39.938829999999996 | Обозерское городское поселение, 普列谢茨基区, 阿尔汉格尔斯克州, 西北联邦区, 164254, 俄罗斯 | {'municipality': 'Обозерское городское поселение', 'county': 'Plesetsky District', 'state': 'Arkhangelsk Oblast', 'region': 'Northwestern Federal District' ', 'postcode': '164254', 'country': '俄罗斯', 'country_code': 'ru'} | 164254 |
3 | 116.516 | 39.9103 | 63.4837 | 39.9103 | 63.48373,39.91033999999999 | Обозерское городское поселение, 普列谢茨基区, 阿尔汉格尔斯克州, 西北联邦区, 164254, 俄罗斯 | {'municipality': 'Обозерское городское поселение', 'county': 'Plesetsky District', 'state': 'Arkhangelsk Oblast', 'region': 'Northwestern Federal District' ', 'postcode': '164254', 'country': '俄罗斯', 'country_code': 'ru'} | 164254 |
4 | 116.472 | 39.9125 | 63.5281 | 39.9125 | 63.52813999999999,39.912480000000016 | Обозерское городское поселение, 普列谢茨基区, 阿尔汉格尔斯克州, 西北联邦区, 164254, 俄罗斯 | {'municipality': 'Обозерское городское поселение', 'county': 'Plesetsky District', 'state': 'Arkhangelsk Oblast', 'region': 'Northwestern Federal District' ', 'postcode': '164254', 'country': '俄罗斯', 'country_code': 'ru'} | 164254 |