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