Geopy reverse возвращает ключевые ошибки для «города», «района» и «района», несмотря на то, что они находятся в объекте ответа JSON

#python #pandas #keyerror #geopy

#python #pandas #ключевая ошибка #geopy

Вопрос:

Я пытаюсь запустить очень простой geopy reverse script, который принимает широтную координату и возвращает конкретно страну, штат и город. Все три из них легко извлекаются из объекта ответа 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'] его для извлечения этой конкретной строки.

Комментарии:

1. Отсутствует ли город для некоторых выходных данных? Это приведет к ключевой ошибке?

2. Ах, это всегда что-то простое — я предположил, что город был возвращен для каждой строки вместо того, чтобы проверять это напрямую. Спасибо, Пол, в будущем я постараюсь быть менее идиотом.

Ответ №1:

Для всех, у кого есть эта проблема, Geopy не всегда возвращает город, район, район и т. Д. таким образом, использование лямбда-функции без учета пропущенных значений даст вам ключевую ошибку.

Следующий код решил эту проблему для меня:

 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 ))