尽管在 JSON 响应对象中,但 'city'、'district' 和 'borough' 的 Geopy 反向 returns 键错误

Geopy reverse returns keyerrors for 'city', 'district' and 'borough' despite being in JSON response object

我正在尝试 运行 一个非常简单的 geopy 反向脚本,它采用经纬度坐标和 returns 特别是国家、州和城市。所有这三个都可以很容易地从 JSON 响应对象中提取。但是,当我尝试提取 'city' 功能时,出现 KeyError。如果我仔细检查 'city' 是否在响应对象中,它肯定是(见下文),那么到底发生了什么?我可以毫无问题地提取国家和州,为什么不能提取城市?我也注意到地区和自治市镇发生了这种情况。

这是我的代码:

df = pd.read_csv('data.csv')
geolocator = Nominatim(user_agent='latlongconvert')
df['address'] = df['LastMatchingLatLong'].apply(geolocator.reverse)

df['country'] = df['address'].apply(lambda x: (x.raw['address']['country']))
df['state'] = df['address'].apply(lambda x: (x.raw['address']['state']))
df['city'] = df['address'].apply(lambda x: (x.raw['address']['city']))

最后一行产生以下错误:KeyError: 'city'

当我查看特定行时,它清楚地包含城市键:

df['address'][0].raw['address']

Ouput:
{'tourism': 'Schwanentempel',
 'road': 'Auedamm',
 'suburb': 'Südstadt',
 'city': 'Kassel',
 'municipality': 'Niestetal',
 'state': 'Hessen',
 'postcode': '34121',
 'country': 'Deutschland',
 'country_code': 'de'}

我什至可以使用 df['address'][0].raw['address']['city'] 为特定行提取它。

对于遇到此问题的任何其他人,Geopy 并不总是 return 城市、自治市镇、地区等,因此使用 lambda 函数而不考虑缺失值会给您一个键盘错误。

以下代码为我解决了这个问题:

df['country'] = df['address'].apply(lambda x: (x.raw['address']['country']))
df['state'] = df['address'].apply(lambda x: (x.raw['address']['state']))
df['city'] = df['address'].apply(lambda x: (x.raw['address']['city'] if 'city' in x.raw['address'].keys() else None ))